簡體   English   中英

fseek和feof的用法

[英]Usage of fseek and feof

我此代碼用於按相反順序讀取文本文件。 它成功了,顯示了文件的原始內容和文件的反向內容。

#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

這是怎么回事 有人可以解釋一下嗎?

它之所以中斷,是因為第二個循環是while (count) ,如果您在遞增文件時沒有先讀完文件, count就是零。 在這種情況下,您可以使用ftell獲得等效count

PS feof(fp)僅測試fp是否在文件末尾,它不會使其尋求EOF,因此feof(fp)基本上不執行任何操作,因為您沒有使用返回值。

正如@Arkku已經顯示的那樣,當您用fseek(SEEK_END)替換while循環時, count不會增加。

要解決此問題,可以在fseek之后使用ftell ,它返回文件長度

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

現在,文件將向后打印。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM