微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ofstream以二进制模式在文件上写入空字符

如何解决ofstream以二进制模式在文件上写入空字符

我们正面临设备重启的问题。我们正在树莓派板上的linux os中运行我们的应用程序。我们正在维护一个日志文件,我们每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)= 300bytes。当我们尝试读取文件时,我们得到的最后100个字节充满了NULL字符。

  1. 如果记录未完全写入,文件大小将如何增加
  2. 记录到底如何用NULL填充?我们已验证所有写入的新记录均不包含NULL字符。

解决方法

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

,
  1. 如果记录未完全写入,文件大小将如何增加?

如果写入了空字节,则空字节的增加与其他字节一样大。

  1. 用NULL填充记录的精确度如何?

它有可能在以下行中发生:

File.write(pBuffer,Size);

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。