5

假设我们有一个名为 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。谁能解释这里发生了什么?

4

2 回答 2

15

文件末尾似乎有一个不可打印的行尾字符。这就是首先打印的内容。然后位置依次移动到3Eb。此时,重新定位-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;
    }
}
于 2013-07-15T16:19:50.137 回答
4

对于以文本模式打开的文件,传递给的偏移量fseek仅对返回的值有意义ftell。所以偏移量不一定以字节为单位。尝试以二进制模式打开文件:

fp = fopen("hi.txt", "rb");

看看结果是否不同。

于 2013-07-15T16:22:53.567 回答