假设我们有一个名为hi.txt的文本文件,其中包含以下字符串:
AbCdE12345
假设我们运行此代码:
int main() {
FILE *fp;
fp = fopen("hi.txt","r");
if(NULL == fp) { return 1; }
fseek(fp,-1, SEEK_END);
while (ftell(fp) > 0) {
printf("%c",fgetc(fp));
fseek(fp,-4, SEEK_CUR);
}
fclose(fp);
return 0;
}
当我运行此代码时,它打印出来:3EbCd
当我试图猜测它会打印什么时,我认为它应该是52d。 谁能解释一下这里发生了什么?
答案 0 :(得分:15)
看起来文件末尾有一个不可打印的行尾字符。这就是首先打印出来的东西。然后,该位置依次移至3
,E
和b
。此时,-3
重新定位失败,因为该位置将变为-2
。文件光标保持原样,即下一个打印的C
。以下重新定位尝试也失败了,因此d
被打印出来。下一次重新定位成功,终止循环。
要检测忽略fseek
的情况,请检查其返回值,如下所示:
while (ftell(fp) > 0) {
printf("%c",fgetc(fp));
// Successful calls of fseek return zero
if (fseek(fp,-4, SEEK_CUR)) {
// Exit the loop if you can't jump back by 4 positions
break;
}
}
答案 1 :(得分:4)