我有一个二进制文件(test.bin),它有2个unsigned int值,分别为1000和4000。 使用下面的代码,我想用第一个写入函数将第一个数字更改为5000,然后我想读取第二个数字并用4000-2000 = 2000重写它。 但是,程序更改1000到5000但它不会更改4000到2000.即使我使用file.flush()或file.sync(),它没有任何影响。 有趣的是,当我放入file.tellg()或file.tellp()时,它可以正常工作。 (我巧合地发现了) 在Linux和Windows上都会发生这种情况。在Linux上,我尝试用g ++编译它。 sizeof(unsigned int)= 4,我确信程序可以打开test.bin。
#include <fstream>
#include <iostream>
using namespace std;
int main(){
fstream file;
unsigned int data, buffer;
data=5000;
file.open("test.bin", ios::binary | ios::in | ios::out);
file.write((char*)&data,4); // will change first number to 5000
// file.flush(); // Nothing changes if I delete comment signs.
// file.tellp(); // Program works correctly if I uncomment this.
// file.tellg(); // Program works correctly if I uncomment this.
file.read((char*)&buffer, 4); // position pointer should be at the beginning of the 2nd number
file.seekp(-4, ios::cur); // Since internal pointer is at the end of the file after the read(), I manually put it back to the beginning of the 2nd number.
buffer-=2000;
file.write((char*)&buffer,4); // Now, it should rewrite 2nd number with 2000.
file.close();
return 0;
}
答案 0 :(得分:2)
宾果!你偶然发现了一个非常模糊,几乎不成文和最不明确的C ++语言要求。我试图主张将其从G ++中删除,然后写了一个补丁来实现这一点,但遇到了来自维护者的冷淡反应在我表明可以完成之后被接受了没有重新设计。
如果内存服务,C ++规范提到文件流使用与C <stdio.h>
流相同的语义,C规范表示在读取和写入同一文件之间必须seek
。
以下是错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45708
讨论#1:http://gcc.gnu.org/ml/libstdc++/2010-09/msg00079.html
讨论#2:http://gcc.gnu.org/ml/libstdc++/2010-09/msg00104.html
编辑:我需要更好的记忆!实际上已于2010年9月22日承诺进入GCC 4.6.0。未提交的其余编辑与在I / O期间更改语言环境codecvt facet相关。
跟踪已接受的更改的错误:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45628