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

C++ ofstream以二进制模式在文件上写入空字符,c++,linux,fstream,ofstream,C++,Linux,Fstream,Ofstream,我们面临设备重新启动的问题。我们在linux操作系统的raspberry pi板上运行我们的应用程序。我们正在维护一个日志文件,每10秒向其中添加一次记录,代码如下。一次写入可以在pBuffer中有一个或多个记录 bool FileOP::Append(const std::string & PathName, const char * pBuffer, uint64_t Size) { bool AppendSuccessful = false; std::ofstre

我们面临设备重新启动的问题。我们在linux操作系统的raspberry pi板上运行我们的应用程序。我们正在维护一个日志文件,每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;
}
bool FileOP::Append(常量std::string&PathName,常量char*pBuffer,uint64\u t Size)
{
bool=false;
流文件的std::of;
尝试
{
异常(std::ofstream::badbit | std::ofstream::failbit);
open(路径名.c_str(),std::ofstream::out | std::ofstream::binary | std::ofstream::app);
文件写入(pBuffer,大小);
File.close();
AppendSuccessful=true;
}
捕获(标准::异常&e)
{
标准::cout
  • 如果记录没有完全写入,文件大小是如何增加的
  • 如果写入空字节,则这些字节会像其他字节一样增加文件大小

  • 记录是如何用NULL填充的
  • 它可能发生在以下行:


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

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

    感谢您的快速回答。但是pBuffer不包含空字符,可能是一些空字符数据中存在字符,但它也包含有效数据。我确信pData不是以空字符开头的。但是,当我们读取时,我们得到的是空字符,这与我们试图插入的最后一条记录的大小相同。@GilsonPJ那么,从您验证它没有满空的方式,或者从您稍后阅读该文件,或者在问题中未显示的其他地方阅读该文件。在启动此函数时,我使用for循环打印了pBuffer。当我在调试时观察到空字符时,我已在gedit中打开该文件并观察到空字符。重新启动后,在任何访问此文件的应用程序之前,我已打开该文件在gedit中删除文件并观察到空字符。
    File.write(pBuffer, Size);