C 使用fseek时出现意外输出
假设我们有一个名为hi.txt的文本文件,其中包含以下字符串: AbCdE12345 假设我们运行以下代码:C 使用fseek时出现意外输出,c,C,假设我们有一个名为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)
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。
有人能解释一下这里发生了什么吗?文件末尾似乎有一个不可打印的行尾字符。这就是第一次印刷的东西。然后该位置依次移动到
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;
}
}
对于以文本模式打开的文件,传递给的偏移量仅对返回的值有意义。因此偏移量不一定以字节为单位。尝试以二进制模式打开文件:
fp = fopen("hi.txt", "rb");
看看结果是否不同