样本程序如下: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { int ele1; int ele2; char ch[20]; }ttt; //结构体.
void addInfo(int *n) { FILE *file=fopen("wmx.dat","w"); int i=0; ttt myttt; for(i=0;i<10;i++) //初始化文件,输入10条记录. { myttt.ele1=((i+100)*7+i)%107; myttt.ele2=((i+309)*5+65)%43; strcpy(myttt.ch,"dkldfjd"); (*n)++; fwrite(&myttt,sizeof(ttt),1,file); //写入. } fclose(file); }
void readFile(int *n) { FILE *file=fopen("wmx.dat","r"); ttt myttt; if(file==NULL) { printf("打开文件失败.\n"); exit(0); } while(!feof(file)) //此处打印的最结果是11条记录. { fread(&myttt,sizeof(ttt),1,file); printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch); // (*n)++; } fclose(file); } int main() { int n=0; addInfo(&n); readFile(&n); printf("%d\n",n); return 0; } 问题处在fread上,用feof判断有问题,可以改为: while (1) { memset(&myttt, 0, sizeof(myttt)); if (fread(&myttt, sizeof(ttt), 1, file) == 1) { printf(); } else { break; } } 原因:feof(file) 的作用是检测读取到的数据是否为文件结束。读完最后一行记录后,file->_flag 没有被置为_IOEOF,因为已经读取到记录了, feof() 没有探测到文件结尾。直到再次调用 fread()读取记录时,才获取文件结束标志,feof() 探测到文件结尾。 当再次调用 fread(&myttt,sizeof(ttt),1,file); 时,myttt 没有获取任何内容,还是上次读取的数据,输出时,当然是跟上次一样。 修改如下: void readFile(int *n) { FILE *file=fopen("wmx.dat","r"); ttt myttt; if(file==NULL) { printf("打开文件失败.\n"); exit(0); } // 检测文件长度,如果大于 0,先读取一行。 if(file->_bufsiz>0) { fread(&myttt,sizeof(ttt),1,file); } while(!feof(file)) //此处打印的最结果是11条记录. { printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch); // 当读取完数据后,读取出文件结束标志, // 回到 while 时,就不再输出下一行了。 fread(&myttt,sizeof(ttt),1,file); } fclose(file); }
|
请发表评论