我试图通过这样做来读取文件中的最后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);
这不会返回任何有意义的东西。为什么呢?
答案 0 :(得分:11)
将50更改为-50。另请注意,这仅适用于ASCII等固定长度的字符编码。从最后找到第50个字符对于像UTF-8这样的东西来说远非微不足道。
答案 1 :(得分:1)
尝试将偏移设置为-50。
答案 2 :(得分:1)
除了偏移的迹象外,以下事情可能会造成麻烦:
换行符使fgets停止读取,但它被认为是有效字符,因此它包含在复制到str的字符串中。
使用ferror或feof检查是否发生错误或是否已达到文件结尾。
答案 3 :(得分:0)
fseek(fptIn,50,SEEK_END)
将流指针设置在文件末尾,然后尝试将光标定位在其前面50个字节。请记住,对于二进制流:
3 对于二进制流,新位置(以文件开头的字符为单位)是通过将偏移量添加到由whence指定的位置获得的。 如果whence是SEEK_SET,则该位置是文件的开头,即文件的当前值 位置指示符,如果SEEK_CUR,或结束文件,如果SEEK_END。 二进制流不需要 有意义地支持fseek调用,其值为SEEK_END。
此调用应该失败。下一次调用fgets
会调用UB。尝试-50作为偏移量,如果调用成功,则尝试将其读入缓冲区
注意:强调我的