[求助高手]如何确定文件结尾!!!!!!!!!
1、结构体如下struct student
{
char num[10]; //学号
char name[15];//姓名
int cgrade; //成绩
int mgrade;
int egrade;
int total; //总分
float ave; //平均分
int mingci; //名次
};
typedef struct node //节点
{
struct student data;
struct node *next;
}Node, *Link;
2、将数据链表保存到了文件c:\student中
3、如何将c:\student的数据读到链表中?????
因为Vc的feof(fp)会在读取结尾的EOF之后才返回0,这样每次都会多分配一个结点空间
----------------------------------【程序】--------------------------------------
下面是程序
void myfread(Link head, FILE *fp)
{
Node *p1, *end = head;
//end指针移到链表尾
while (end->next)
{
end = end->next;
}
//文件为空,文件标识为0
if (EOF==(c=fgetc(fp)))
flagf = 0;
rewind(fp);
while (flagf && !feof(fp))
{
p1 = (Link)malloc(sizeof(Node));
if (!p1)
{
printf("\n allocate memory failure!\n");
return ;
}
if(1 == fread(p1, sizeof(Node), 1, fp));
{
end->next = p1;
p1->next = NULL;
end = p1;
count++;
}
}
}
-----------------------------------【结果】-------------------------------------------
===================STUDNET======================
| number | name |Clanguage|Math|Eng| sum | ave |
------------------------------------------------
| 1 |Frank | 99 | 99 | 198 | 99 |
------------------------------------------------
| 2 | Tom | 98 | 98 | 196 | 98 |
------------------------------------------------ -----------------------------------------------
|屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯|屯屯屯屯屯屯屯屯屯 由于feof要等EOF读出才置位,所以多分配了一个结点
|-84324121|-832718
------------------------------------------------- -----------------------------------------------
-----------------------------------【最终解决】--------------------------------------
int MyRead(Link head, FILE *fp)
{
Node *p, *end;
int count = 0;
end = head;
//文件不为空,读入数据,返回读入的记录个数
//进入循环,只要没有到文件尾
while(!feof(fp))
{
//分配节点,检验,结尾
p = (Link)malloc(sizeof(Node));
if (!p)
{
fflush(stdin);
printf("内存分配失败!\n\n");
getchar();
return -1;
}
//end指向尾结点
while (end->next)
{
end = end->next;
}
//读取一个数据到节点p
if (0==(fread(p, sizeof(Node), 1, fp)))
{
fflush(stdin);
printf("文件读取完毕, O(∩_∩)O哈哈~\n\n"); //因为每次读取一个节点,所以最后文件读取会失败
getchar(); //也就是独到最后不能读出一个节点fread()函数会返回0
return count; //这样就可以作为文件结尾的标志了
}
p->next = NULL;
//p接到end后,end=p
end->next = p;
end = p;
count ++;
}
return count;
}
[ 本帖最后由 frank2014 于 2010-6-29 15:19 编辑 ]