Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;文件中的最后一个字符_C++_File_Char - Fatal编程技术网

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

C++ C++;文件中的最后一个字符,c++,file,char,C++,File,Char,我想使用以下代码获取文件中的最后一个字符 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将形成一个字符串。因为您只给它一个字节来处理,所以

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

 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
将形成一个字符串。因为您只给它一个字节来处理,所以它只能返回一个空字符串,因为它需要该字节来存储
'\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);

尝试使用
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("%s\n", last);
        }
    }

    return 0;
}
我将你的fseek改为从末尾开始搜索两个,所以测试将打印句点。 另一个答案指出,我使用fgetc而不是fgets,因为您 查找单个字符,而不是完整字符串

我还将last-to-last[2]进行了更改,并将其初始化为零,以便
最后一个字符是以零结尾的字符串,用于演示。

如果它是一个正确的文本文件,那么最后一个字符不是
\n
?此代码不会编译,因为在
fclose(f)之前缺少一个
@user315052:不,为什么会是这种情况?@BenjaminLindley:这可能表示无意中截断了文本文件。例如,您的文本编辑器崩溃。@user315052:可能会崩溃,但您完全可以保存文本文件,而不必使用尾随的新行字符。
octopusgrabbus@steamboy:~/scratch$ cat temp.txt
This is a test.
octopusgrabbus@steamboy:~/scratch$