c++ - 使用 C++ 更新二进制文件中的记录

标签 c++ binary fileoutputstream

我遇到了一个问题,我目前的 C++ 知识不足以解决它。我在 Stroustrup 的书中寻找答案,但现在还没有完全理解我做错了什么。

所以本质。

我写入文件:

int i = 1;
int j = 2;
ofstream ofs("file", ios::binary);
ofs.write(as_bytes(i), sizeof(int));
ofs.write(as_bytes(j), sizeof(int));

之后,我需要更新第二个值:

int j = 10;
ofstream ofs("file", ios::binary);
ofs.seekp(4, ios::beg);
ofs.write(as_bytes(j), sizeof(int));

当我尝试读取文件时:

int i = 0;
int j = 0;
ifstream ifs("file", ios::binary);
ifs.read(as_bytes(i), sizeof(int));
ifs.read(as_bytes(j), sizeof(int));
cout << i << ' ' << j << endl;

结果我丢了第一个值。我究竟做错了什么?为什么消失了?

最佳答案

默认情况下,文件将被截断(ios:trunc,即打开文件进行写入时内容会丢失)。

对于第二个写入操作,尽管您只是在写入,但显式添加标志 ios:inios:out。所以基本上我会使用以下内容:

ofstream ofs("file", ios::binary | ios::in | ios::out | ios::ate);

这应该打开文件,流/文件指针位于文件末尾(不过 ios::ate 可能是可选的)。

关于c++ - 使用 C++ 更新二进制文件中的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7100019/

相关文章:

python - Django BinaryField 检索为内存位置?

android - 如何使用 Intent.ACTION_CREATE_DOCUMENT 编写文件

java - 使用 Okio 在 Android 上写入文件

c++ - 在 win32 上将 wav 文件解码为 raw

c++ - 在 cpp 中使用正则表达式将密码 ('abcs' ) 子句屏蔽为密码 ('****' )

c++ - QNetworkAccessManager,重置 TCP 连接

file - go - 使用 struct 读取二进制文件

c++ - C++中的通用二进制搜索

c++ - 在我的程序中使用for循环打印出矩阵的一个错误

c++ - 访问使用接口(interface)实例化的类的私有(private)成员