C++文件中的最后一个字符

C++ last character in file

本文关键字:最后一个 字符 文件 C++      更新时间:2023-10-16

我想使用以下代码获取文件中的最后一个字符

 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]并初始化为零,所以我可以治疗最后一个字符作为以零结尾的字符串,用于演示目的。