使用fseek()读取文件的最后50个字符

时间:2010-02-15 09:53:20

标签: c file fseek

我试图通过这样做来读取文件中的最后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 个答案:

答案 0 :(得分:11)

将50更改为-50。另请注意,这仅适用于ASCII等固定长度的字符编码。从最后找到第50个字符对于像UTF-8这样的东西来说远非微不足道。

答案 1 :(得分:1)

尝试将偏移设置为-50。

答案 2 :(得分:1)

除了偏移的迹象外,以下事情可能会造成麻烦:

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

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

See also

答案 3 :(得分:0)

  

fseek(fptIn,50,SEEK_END)

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

  

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

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

  

注意:强调我的