【发布时间】:2013-07-06 08:55:15
【问题描述】:
我有一个已经包含一些数据的文件(比如 8 kB)。我想从文件的开头读取一些东西,然后从我读完的地方开始覆盖数据。所以我尝试使用以下代码:
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;
如果我执行这段代码,第一个bad() 返回false,但第二个返回true,实际上没有写入任何内容。
如果我将 bytesCount 减小到小于 4096 的任何值(可能是某个内部缓冲区的大小),第二个 bad() 将返回 false,但仍然没有写入任何内容。
如果我取消注释 seekp() 行,写入开始工作:bad() 返回 false 并且字节实际被写入。
为什么这里需要seekp()?为什么没有它就行不通? seekp() 是正确的方法吗?
我在 Windows 7 上使用 Visual Studio 2012。
【问题讨论】:
标签: c++ visual-studio-2012 iostream fstream