在Linux下写了个简单的文件读并打印出来的程序,为什么最后一条记录打印了两遍呢?
- C/C++ code
#include <stdio.h> #include <stdlib.h> struct stock { char name[20]; int price; }; int main() { FILE *file; file = fopen("./stockInfo.txt", "r"); if(file == NULL) { printf("open file failed!\n"); exit(-1); } struct stock buffer; while(!feof(file)) { fscanf(file, "%s %d", buffer.name, &buffer.price); printf("%s %d", buffer.name, buffer.price); } return 0; }
stockInfo.txt
是在linux下用vi添加到两行记录
stocka 111
stockb 222
在c++版有同样问题 也是你问的吧
feof在文件没有数据的时候,也就是文件结尾还能true一次,下一次才会跳出循环,所以最好用
fscanf(file, "%s %d", buffer.name, &buffer.price) == 2作为循环条件
- C/C++ code
while(!feof(file))
/*fscanf到达文件尾时,并没有立刻执行feof(file),
*而是在printf之后才去检测是否到达文件尾的.
*因此会再一次输出buffer的内容
*而你也没有在读到buffer里面前memset,
*所以最后一条会重复输出
*/
{
fscanf(file, "%s %d", buffer.name, &buffer.price);
printf("%s %d", buffer.name, buffer.price);
}while(1)
{
memset(&buffer,0x00,sizeof(struct stock));
fscanf(file, "%s %d", buffer.name, &buffer.price);
if(feof(file))break;/*到达文件尾立刻跳出*/
printf("%s %d\n", buffer.name, buffer.price);
}