【问题标题】:Usage of fseek and feoffseek 和 feof 的使用
【发布时间】:2014-02-21 06:58:48
【问题描述】:

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

#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 向前移动 1,因此需要将其向后倒退 2,最初它也将指向 EOF

这里发生了什么?谁能解释一下?

【问题讨论】:

    标签: c fseek


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      现在文件将向后打印。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多