C++ 使用相同的fstream读取和写入同一文件
我有一个文件已经包含了一些数据(比如8KB)。我想从文件的开头读取一些内容,然后从我完成读取的地方开始覆盖数据。因此,我尝试使用以下代码:C++ 使用相同的fstream读取和写入同一文件,c++,visual-studio-2012,iostream,fstream,C++,Visual Studio 2012,Iostream,Fstream,我有一个文件已经包含了一些数据(比如8KB)。我想从文件的开头读取一些内容,然后从我完成读取的地方开始覆盖数据。因此,我尝试使用以下代码: std::fstream stream("filename", std::ios::in | std::ios::out | std::ios::binary); char byte; stream.read(&byte, 1); // stream.seekp(1); int bytesCount = 4096; auto bytesVec
std::fstream stream("filename", std::ios::in | std::ios::out | std::ios::binary);
char byte;
stream.read(&byte, 1);
// stream.seekp(1);
int bytesCount = 4096;
auto bytesVec = std::vector<char>(bytesCount, 'c');
char* bytes = bytesVec.data();
std::cout << stream.bad() << std::endl;
stream.write(bytes, bytesCount);
std::cout << stream.bad() << std::endl;
std::fstream流(“文件名”,std::ios::in | std::ios::out | std::ios::binary);
字符字节;
stream.read(&字节,1);
//流。seekp(1);
int字节数=4096;
auto bytesVec=std::vector(bytescont,'c');
char*bytes=bytesVec.data();
std::cout你违反了读写混合的限制
在MS的fstream
库继承自其C
实现
C标准(我引用C99,但在这一点上它与C89没有区别)
第7.19.5.3/6条规定:
以更新模式打开文件时(“+”作为
上述模式参数值列表),可在上执行输入和输出
关联流。但是,输出后不得直接跟随输入,无需
对fflush函数或文件定位函数(fseek,
fsetpos或倒带),输入后不得直接跟随输出,无需
对文件定位函数的中间调用,除非输入操作遇到end-
一份文件
(我的重点)
因此,您的stream.seekp(1)
解决方案是正确的,该解决方案属于Cfseek
GNUC库没有这个标准限制,所以您发布的代码可以正常工作
与使用GCC构建时的预期一样
MS继承了C++中的C++标准
这一限制
fstream
s使用basic\u filebuf
实现。在(C++11)标准对该模板的说明中,在§27.9.1.1/2中,它简单地说:
读写由basic_filebuf类对象控制的序列的限制与读写标准C库文件的限制相同
您可能想查看捆绑流-
<>这使得每次输入读取输出都会自动刷新,这是我认为你想要的行为,尽管它确实需要一个单独的输入和输出流这是否也为C++流记录?还是MS的实施没有遵循这方面的标准?