Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用相同的fstream读取和写入同一文件_C++_Visual Studio 2012_Iostream_Fstream - Fatal编程技术网

C++ 使用相同的fstream读取和写入同一文件

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

我有一个文件已经包含了一些数据(比如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::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)
解决方案是正确的,该解决方案属于C
fseek

GNUC库没有这个标准限制,所以您发布的代码可以正常工作 与使用GCC构建时的预期一样

MS继承了C++中的C++标准 这一限制

fstream
s使用
basic\u filebuf
实现。在(C++11)标准对该模板的说明中,在§27.9.1.1/2中,它简单地说:

读写由basic_filebuf类对象控制的序列的限制与读写标准C库文件的限制相同


您可能想查看捆绑流-


<>这使得每次输入读取输出都会自动刷新,这是我认为你想要的行为,尽管它确实需要一个单独的输入和输出流

这是否也为C++流记录?还是MS的实施没有遵循这方面的标准?