【问题标题】:ofstream writes null characters on a file in binary modeofstream 以二进制模式在文件上写入空字符
【发布时间】:2020-11-03 03:06:31
【问题描述】:

我们面临设备重启的问题。我们在树莓派板上的 linux 操作系统中运行我们的应用程序。我们正在维护一个日志文件,我们每 10 秒使用以下代码将记录附加到该文件中。一次写入在 pBuffer 中可以有一条或多条记录。

bool FileOP::Append(const std::string & PathName, const char * pBuffer, uint64_t Size)
{
    bool AppendSuccessful = false;
    std::ofstream File;

    try
    {
        File.exceptions(std::ofstream::badbit | std::ofstream::failbit);
        File.open(PathName.c_str(), std::ofstream::out | std::ofstream::binary | std::ofstream::app);
        File.write(pBuffer, Size);
        File.close();
        AppendSuccessful = true;
    }
    catch (std::exception & e)
    {
        std::cout << "Error when appending string to file: " << PathName
                  << std::strerror(errno) << " Exception : " << e.what() << std::endl;
    }

    return AppendSuccessful;
}

我们观察到,当我们写入数据时,如果我们重新启动板(断电),我们会得到一个包含完整 NULL 字符的记录。文件大小将根据记录大小增加,例如如果我们写入 100 字节,文件大小将是标题大小(100)+ 旧数据大小(100)+ 新数据(100)= 300 字节。当我们尝试读取文件时,最后 100 个字节充满了 NULL 字符。

  1. 如果记录未完全写入,文件大小如何增加?
  2. 究竟如何用NULL 填充记录?我们已验证写入的每条新记录都不包含 NULL 字符。

【问题讨论】:

    标签: c++ linux fstream ofstream


    【解决方案1】:

    这将取决于正在使用的文件系统,但这里可能发生的情况是,文件系统在写入所有数据之前正在提交对文件元数据(在本例中为它的长度)的更改。如果您要求文件即使在崩溃的情况下也保持一致,并且正在使用 ext4,请尝试使用 data=journal 选项进行挂载。请注意,由于禁用延迟分配,这会对性能产生影响。

    【讨论】:

      【解决方案2】:
      1. 如果记录未完全写入,文件大小如何增加?

      如果写入空字节,则这些字节会增加文件大小,就像任何其他字节一样。

      1. 记录究竟是如何被 NULL 填充的?

      它可能发生在以下行:

      File.write(pBuffer, Size);
      

      如果pBuffer 包含空字符,则将这些空字符写入文件。

      【讨论】:

      • 感谢您的快速回答。但是 pBuffer 没有充满 NULL 字符,可能是数据中存在一些 NULL 字符但它也包含有效数据。而且我确信 pData 不是以 NULL 字符开头的。但是当我们阅读时,我们得到的是 NULL 字符,并且与我们尝试插入的最后一条记录的大小相同。
      • @GilsonPJ 然后有一些东西来自你验证它没有充满 null 的方式,或者你稍后读取文件的方式,或者其他地方不是显示在问题中。
      • 使用 for 循环我在这个函数的开头打印了 pBuffer。当我在调试时观察到 NULL 字符时,我在 gedit 中打开了这个文件并观察到了 NULL 字符。稍后重启后,在任何应用程序访问此文件之前,我已在 gedit 中打开该文件并观察到 ​​NULL 字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      相关资源
      最近更新 更多