0

我正在尝试通过执行以下操作来读取文件中的最后 50 个字符:

FILE* fptIn;
char sLine[51];
if ((fptIn = fopen("input.txt", "rb")) == NULL) {
    printf("Coudln't access input.txt.\n");
    exit(0);
}
if (fseek(fptIn, 50, SEEK_END) != 0) {
    perror("Failed");
    fclose(fptIn);
    exit(0);
}
fgets(sLine, 50, fptIn);
printf("%s", sLine);

这不会返回任何远程有意义的东西。为什么?

4

4 回答 4

11

将 50 更改为 -50。另请注意,这仅适用于固定长度的字符编码,如 ASCII。对于 UTF-8 之类的东西,从末尾找到第 50 个字符绝非易事。

于 2010-02-15T09:55:10.397 回答
1

尝试将偏移量设置为 -50。

于 2010-02-15T09:58:23.373 回答
1

除了偏移的符号之外,以下事情可能会造成麻烦:

换行符使 fgets 停止读取,但它被认为是有效字符,因此它包含在复制到 str 的字符串中。

使用 ferror 或 feof 检查是否发生错误或到达文件结尾。

也可以看看

于 2010-02-15T09:58:27.957 回答
0

fseek(fptIn, 50, SEEK_END)

将流指针设置在文件末尾,然后尝试将光标定位在其前面 50 个字节处。请记住,对于二进制流:

3对于二进制流,新位置(以字符为单位从文件开头开始测量)通过将偏移量添加到whence 指定的位置来获得。如果whence 是当前值SEEK_SET,则指定位置是文件的开头如果是 SEEK_CUR,则为文件位置指示符;如果是 SEEK_END,则为文件结尾。二进制流不需要有意义地支持 wherece 值为 SEEK_END 的 fseek 调用。

这个调用应该失败。下一次调用fgets调用 UB。尝试 -50 作为偏移量,并且如果调用成功尝试将其读入缓冲区

注意:强调我的

于 2010-02-15T10:02:53.770 回答