使用fseek和feof

时间:2014-02-21 06:58:49

标签: c fseek

我这段代码用于以相反的顺序读取文本文件。它成功了,显示文件的原始内容和文件的反转内容。

#include <stdio.h>
#include <stdlib.h>
int main()  {

    int count = 0, ch = 0;
    FILE *fp;
    if( (fp = fopen("file.txt", "r")) == NULL )    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    printf("\tINPUT FILE\n");
    printf("\n");
    while(!feof(fp))    {
        if((ch = getc(fp)) != EOF)  {
            printf("%c", ch);
            count ++;
        }
    }
    feof(fp);
    printf("\n");
    printf("\tREVERSED INPUT FILE\n");
    printf("\n");
    while(count)    {
        fseek(fp, -2, SEEK_CUR);
        printf("%c", getc(fp));
        count--;
    }
    printf("\n");
    fclose(fp);
}

但是当我换掉这段代码时

while(!feof(fp))    {
   if((ch = getc(fp)) != EOF)  {
       printf("%c", ch);
       count ++;
   }
}

通过

fseek (fp, 0, SEEK_END); or  feof(fp);

基本上我只是直到文件结尾并且直接没有打印文件的原始内容并尝试打印文件的反转内容。 但是因为它不打印反转内容提交!!!它只显示空白。为什么会发生这种情况?

注意:fseek(fp, -2, SEEK_CUR);已完成此操作(在另一个while循环中),因为getc(fp)将fp向前移动一个,因此需要将它倒回两个,最初也会指向EOF

这里发生了什么?任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

它会中断,因为第二个循环是while (count),如果在递增文件时没有先读取文件,则count为零。在这种情况下,您可以使用ftell获取等效的count

P上。 S. feof(fp)仅测试fp是否在文件末尾,它不会使它寻求EOF,所以行feof(fp)基本上什么都不做,因为你没有使用返回值。

答案 1 :(得分:1)

正如@Arkku已经显示的那样,当您使用while替换fseek(SEEK_END)循环时,count将不会增加。

要解决此问题,您可以在fseek之后使用ftell,这会返回文件长度

fseek(fp, 0, SEEK_END);
count = ftell(fp);

现在文件将向后打印。