【问题标题】:C++ last character in fileC ++文件中的最后一个字符
【发布时间】:2012-07-06 03:39:41
【问题描述】:

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

 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 文件有问题吗?感谢您的帮助。

【问题讨论】:

  • 如果是正确的文本文件,最后一个字符不是\n吗?
  • 这段代码无法编译,因为你在fclose(f);之前缺少了一个)
  • @user315052:不,为什么会这样?
  • @BenjaminLindley:这可能表示文本文件被无意截断。例如,您的文本编辑器崩溃了。
  • @user315052:可以,但完全可以保存文本文件,而无需尾随换行符。

标签: c++ file char


【解决方案1】:

问题是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);

【讨论】:

    【解决方案2】:

    尝试使用fgetc 而不是fgets

    【讨论】:

      【解决方案3】:

      我对您的代码进行了一些更改以打印最后一个字符。这里以 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 更改为从末尾开始搜索两个,因此 test 将打印句点。 正如另一个答案所示,我使用 fgetc 而不是 fgets,因为你是 寻找单个字符,而不是完整的字符串。

      我也将 last 更改为 last[2] 并初始化为零,所以我可以处理 最后一个字符作为以零结尾的字符串用于演示目的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 2016-10-11
        • 1970-01-01
        • 2013-06-05
        相关资源
        最近更新 更多