[英]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.