gpt4 book ai didi

c++ - 正确读取数据但写入错误

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:07 25 4
gpt4 key购买 nike

我正在尝试读取文件的特定二进制数据(2 字节)并且此任务运行良好,但在同一位置再次重写该文件(2 字节)时出现问题。不幸的是,它将整个文件数据更改为零。

看下面两张截图:

写入前的数据:

写入后的数据:

代码:

bool myClass::countChanger() {
std::ifstream sggFileObj_r(this->sggFilePath, std::ios::binary);
if (!sggFileObj_r.is_open()) {
std::cerr << strerror(errno) << std::endl;
return false;
}
// Buffer variable
unsigned short count;
// Move the file pointer to offset 4
sggFileObj_r.seekg(4);
// Reading data
sggFileObj_r.read((char*)&count, sizeof(unsigned short));
sggFileObj_r.close();
//// ---------------------- ////
std::ofstream sggFileObj_w(this->sggFilePath, std::ios::binary | std::ios::app);
// Increase the buffer variable by one
count += 1;
// Move the file pointer again to offset 4
sggFileObj_w.seekp(4);
// Rewriting data again to the file after modification
sggFileObj_w.write((char*)&count, sizeof(unsigned short));
sggFileObj_w.close();
return true;
}

为什么会这样,如何解决?


更新:

我已将 std::ios::app 附加到文件模式,解决了 zeros 问题,但未更新我要更新的特定数据。

最佳答案

使用

std::ofstream sggFileObj_w(this->sggFilePath, std::ios::binary)

将清除文件中的数据,因为这是 ofstream 默认执行的操作。你可以使用

std::ofstream sggFileObj_w(this->sggFilePath, std::ios::binary | std::ios::app);

以阻止数据被覆盖,但问题是文件流从文件末尾开始并假装文件的其余部分不存在,因此您可以返回到开头并覆盖其内容。

你可以做的是使用 fstream 之类的

std::fstream sggFileObj_w(this->sggFilePath, std::ios::binary | std::ios::out | std::ios::in);

从头开始以二进制模式打开文件而不丢失任何内容。然后你可以寻找你想写入文件的位置。

关于c++ - 正确读取数据但写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55942046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com