二进制文件中的C++Seekp()正在删除数据



我想用seekp((函数和二进制文件来修改某个整数的数据。我制作了一个简单的测试程序来测试seekp功能,但它不起作用,而是删除了文件中的旧内容。

// position in output stream
#include <fstream>      // std::ofstream
#include <iostream>
int main() {
std::ofstream outfile{"test.dat" ,std::ios::binary| std::ios::out};
struct t {
int x;

};
t t1{ 36};
t t2{ 2 };
t t3{ 3 };

outfile.seekp(4 , std::ios::beg );
outfile.write((char*)&t1 , sizeof(t1));
outfile.write((char*)&t2, sizeof(t2));
outfile.write((char*)&t3, sizeof(t3));

outfile.close();
std::ifstream iutfile{ "test.dat" ,std::ios::binary  };
t read;
while (iutfile.read((char*)&read, sizeof(read)))
{
std::cout << "nnt" << read.x;
}
iutfile.close();
return 0;
}

#以下是我测试它的步骤:#
1(注释outfile.seekp(4,std::ios::beg(;在上面的代码中,它将打印文件中的内容
2(现在取消对seekp行的注释,并对两个outfile.write((行进行注释,留下一行来测试seekp是否放置了指针,以便我可以准确地写入。但当我这样做时,以前的数据丢失了
3(然后我尝试注释所有未注释的写行,然后我看到整个文件都被删除了

我做错了什么,我不能理解。我试过seekp(sizeof(int(,std::ios::beg(,但它也不起作用。。请帮忙

每次打开文件都会破坏文件的内容,这与seekp无关。

std::ios::out隐含着std::ios::trunc的意思,除非也有std::ios::instd::ios::app(是的,这是一团糟(。有关标志如何相互作用的详细描述,请参阅cppreference。

您需要在附加模式下打开文件,然后seekp来定位您感兴趣的位置:

std::ofstream outfile{"test.dat" ,std::ios::binary | std::ios::app}; //out is optional 
std::ofstream outfile{"test.dat" ,std::ios::binary | std::ios::app | std::ios::out}; 

最新更新