我想使用以下代码
获取文件中的最后一个字符 FILE * f = fopen ( f_text, "r" );
if (f )
{
if (fseek( f, -1, SEEK_END ) != 0 ) fclose (f);
char last[1];
fgets(last, 1, f );
...
但只有“”存储在变量last中。错误在哪里?
unicode文件有问题吗?谢谢你的帮助。
答案 0 :(得分:4)
问题是fgets
将形成一个字符串。由于你只给它一个字节,它只能返回一个空字符串,因为它需要该字节来存储'\0'
。
正如James Kanze向我指出的那样,如果您以二进制模式打开文件,则只能以您想要的方式使用fseek
。由于文件现在处于二进制模式,因此使用fgets
是不合适的。所以你会改用fread
。
FILE *f = fopen(f_text, "rb");
if (f == 0) throw 0;
try {
if (fseek(f, -1, SEEK_END) != 0) throw 0;
char last[1];
if (fread(last, 1, 1, f) != 1) throw 0;
//...
}
catch (...) {
fclose(f);
throw;
}
fclose(f);
答案 1 :(得分:0)
尝试使用fgetc
代替fgets
答案 2 :(得分:0)
我对您的代码进行了一些更改以打印最后一个字符。这是test.c作为样本:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
FILE * f;
char * f_text = "temp.txt";
f = fopen ( f_text, "r" );
if (f )
{
if (fseek( f, -2, SEEK_END ) == 0 )
{
char last[2] = {0};
printf("Got here.\n");
last[0] = fgetc( f );
printf("%s\n", last);
}
}
return 0;
}
这里是命令行显示的temp.txt。
octopusgrabbus@steamboy:~/scratch$ cat temp.txt
This is a test.
octopusgrabbus@steamboy:~/scratch$
我改变你的fseek从最后寻找两个,所以测试将打印期间。 正如另一个答案所示,我使用的是fgetc而不是fgets,因为你是 寻找一个单独的角色,而不是一个完整的字符串。
我也最后改为[2]并初始化为零,所以我可以对待 最后一个字符作为零终止字符串,用于演示目的。