C++文件中的最后一个字符
C++ last character in file
我想使用以下代码获取文件中的最后一个字符
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 文件有任何问题吗?感谢您的帮助。
问题是fgets
会形成一个字符串。由于您只给了它一个字节来使用它,因此它只能返回一个空字符串,因为它需要该字节来存储' '
。
正如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);
尝试使用 fgetc
而不是 fgets
我对代码进行了一些更改以打印最后一个字符。以下是 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("%sn", last);
}
}
return 0;
}
这是 temp.txt显示在命令行中。
octopusgrabbus@steamboy:~/scratch$ cat temp.txt
This is a test.
octopusgrabbus@steamboy:~/scratch$
我把你的fseek改成了从最后开始寻找两个,所以测试会打印句点。正如另一个答案所表明的那样,我使用 fgetc 而不是 fgets,因为你是寻找单个字符,而不是完整的字符串。
我还将最后更改为最后[2]并初始化为零,所以我可以治疗最后一个字符作为以零结尾的字符串,用于演示目的。
相关文章:
- 使用连续分隔符和空最后一个字符进行拆分
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 比较最后一个字符,不区分大小写(带谓词?
- 在弦乐器中删除最后一个字符
- 输入文件中的第一个字符是输出文件中的最后一个字符,反之亦然
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 如何查看复杂度为 O(1) 的字符串流对象中的最后一个字符
- 最后一个字符行编辑
- 如何在C 中获得字符串的最后一个字符
- 如何在C++中删除 UTF-8 字符串的最后一个字符
- 如何获取输入文件的行的第二个和最后一个字符,并在C++中组成数组
- 输出流中的第一个字符将替换为该流中被删除的最后一个字符.为什么会这样
- 正在将最后一个字符发送到std::cout
- 获取字符串流中的最后一个字符,而不复制其整个缓冲区
- remove_if字符串中的最后一个字符
- 如何删除最后一个字符
- 从字符数组中删除第一个和最后一个'X'字符
- C++文件中的最后一个字符
- (C++)如何从特定(结束)点查找 std::string 中的最后一个字符
- 如何获取您放入 ostream 对象中的最后一个字符