为什么写此二进制文件会切断文件的结尾?

Diet_Pepsi_bottle

因此,我要做的是创建一个结构数组。然后,我将该数组写入二进制文件。我认为寻求文件中的第二个结构并将其覆盖。然后,我将文件读回到单独的结构数组中,并将其打印到屏幕上。

写入完成后,文件大小将从24字节变为16字节,第一个结构损坏,最后一个结构从文件中丢失。

这是我的代码:

#include<fstream>
#include<iostream>
using namespace std;

struct Point
{
    int x, y;
};

void print(const Point& p)
{
    cout << "(" << p.x << ", " << p.y << ")" << endl;
}

int main()
{
    Point p[] = {{1, 2}, {3, 4}, {5, 6}};

    for(auto a : p)
        print(a);

    // write array p to file
    fstream f("points.dat", ios::binary | ios::out);
    if(f)
    {
        f.write(reinterpret_cast<char*>(p), 3 * sizeof(Point));
        f.close();
    }

    // read second struct from file and print it to screen
    f.open("points.dat", ios::binary | ios::in);
    if(f)
    {
        Point p;
        f.seekg( 1 * sizeof(Point), ios::beg);
        f.read(reinterpret_cast<char*>(&p), sizeof(Point));
        f.close();
        print(p);
    }

    // change ios::out to ios::ate and it works fine...
    f.open("points.dat", ios::binary | ios::out);
    if(f)
    {
        Point p ={-1, -2};
        f.seekp(1 * sizeof(Point), ios::beg);
        // attempting to overwrite the second struct in the file 
        // shrinks the file from 24 bytes to 16, losing the last
        // struct in the file and causing the first struct to have
        // 0's in it's fields.
        f.write(reinterpret_cast<char*>(&p), sizeof(Point));
        f.close();
    }


    Point q[3];
    // read the file back into q and print q for testing.
    f.open("points.dat", ios::binary | ios::in);
    if(f)
    {
        // fails because the file is now only 16 bytes, instead of 24 
        f.read(reinterpret_cast<char*>(q), 3 * sizeof(Point));      
        f.close();

        for(auto a : q)
            print(a);
    }   
}

烦人的部分是,当我将ios :: out更改为ios :: ate时,它工作得很好。

轨道轻赛

binary|out与相同binary|out|trunc

即,当您使用该标志组合时,默认情况下会截断文件。

  • 如果只想追加,则需要binary|out|app
  • 否则,您想要binary|out|in

是的,我知道您没有阅读。是的,对于第二个选项,文件必须已经存在。是的,很奇怪。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么去安装在src目录中写二进制文件?

为什么“二进制文件”不在原始二进制文件中?

为什么 git 会阻止合并二进制文件?

为什么使用LTO会增加Rust二进制文件的大小?

为什么在可执行二进制文件中插入字符会导致其“中断”?

为什么“链接时间优化”会导致二进制文件更大?

为什么我会执行二进制文件错误?

为什么函数定义的顺序会更改输出二进制文件?

cat为什么更改二进制文件的内容?

为什么忽略二进制文件是最佳做法?

为什么git索引文件是二进制的?

为什么从二进制文件中读取此流停止在0x1A字符处?

为什么使用HsColour二进制文件的存在/不存在会强制重新编译QuickCheck库?

Perl模块取决于二进制文件,即使使用CheckBin,为什么在FreeBSD上测试也会失败?

Symfony BinaryFileResponse切断文件结尾?

为什么写文件二进制方法有时返回一个字母而其他一个十六进制?

如何执行此Go二进制文件?

为什么二进制文件不是文本文件,而所有文本文件都是二进制文件?

为什么git认为我的.sql文件是二进制文件?

为什么cmake的安装文件与实际构建的二进制文件不同?

为什么我不能将二进制文件的输出重定向到文件?

为什么GCC根据文件创建共享对象而不是可执行二进制文件?

为什么Git将此文本文件视为二进制文件?

为什么`cargo new`创建二进制文件而不是库文件?

为什么我的文本文件比二进制文件大?

为什么可执行二进制文件包含包含的头文件的路径?

为什么在版本控制系统中将.pbxproj文件视为二进制文件?

为什么使用 git 从 powershell 复制的二进制文件与原始文件不同?

是什么使grep认为文件是二进制文件?