日期:2014-05-16  浏览次数:20731 次

在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);
    }