2011-03-18 54 views
0

我使用fgets();FEOF,似乎不工作 - 文本文件

一个文本文件中读取行我有一个循环:while(!feof(fp))

的事情是,该程序保持在进入循环即使在达到并读取最后一行之后,并且在调试文件ptr时只显示点而不显示一串数据。

我怎样才能知道我已经达到了最后,而不是再次进入循环?

 while (!feof(fp)) { 
      if (strcmp(data2->ID ,data1->ID)<0) { 

       fseek(fp, backTo, SEEK_SET); 
       fprintf(fp, "%s",lin2); 
       fprintf(fp, "%s",lin1); 

       flag = 1; 
      } 
      else 
      { 
       strcpy(data1->ID,data2->ID); 
       strcpy(data1->name,data2->name); 
       data1->price=data2->price; 

      } 

      if(fgets(line2, sizeof(line2),fp)!=NULL) 
      { 
       itemSize2=strlen(line2)+1; 
       strcpy(data2->ID,strtok (line2,",")); 
      } 

     } 

只有在文本文件中的行,我用FSEEK和去文件的开头,然后我用fprintf中两次,并在这些线上写,以后我应该到达EOF

+2

更多的代码,请。 – svens 2011-03-18 16:42:59

+0

简化你的代码,看看feof是否仍然行为不端。对于初学者,fset可能会重置eof标志。 – Arkadiy 2011-03-18 17:01:15

回答

4

你的意思是它进入循环一次?

feof(fp)如果程序试图读取超出文件末尾而不是读取它时返回true。系统不一定知道是否有更多的文件(它可能是动态生成的,stdin是典型的例子),但是确实知道它是否到达文件结尾。

你需要每个fgets(fp)之后测试feof(fp),或测试,看看有多少个字符被fgets(fp)返回,或做一个字符getunget

+0

它继续进入循环,并不知道它何时到达文件末尾 – Nadav 2011-03-18 16:53:10

+0

@Nadav:你能更准确吗?它是否在同一次运行中读取最后一次输入或多次输入while循环体? – 2011-03-18 16:58:29

+0

有一个fseek调用,它将文件ptr 2行,文件中只有两行,我使用fprintf在它们上面写入,在我写入它们之后使用fgets,然后我应该去掉eof,但它会一直持续在while循环中永远 – Nadav 2011-03-18 17:00:27

-1

嗯,我用这个自定义函数....

BOOL CheckFileEnd(FILE *fp) 
{ 
    BOOL res; 
    long currentOffset = ftell(fp); 

    fseek(fp, 0, SEEK_END); 

    if(currentOffset >= ftell(fp)) 
     res = TRUE; 
    else 
     res = FALSE; 

    fseek(fp, currentOffset, SEEK_SET); 

    return res; 
}