我想知道是否可以使用“fstream”从二进制文件中读取一个字节,然后更改该字节并将其写回。 我尝试了这段代码,但它没有用,没有任何反应,但我确信它读得正确。
file.open(path, ios::in|ios::out|ios::binary|ios::ate);
file.seekg(0, ios::end);
int size=file.tellg();
file.seekg(0,ios::beg);
char buffer;
for(int i=0;i<size;i++)
{
file.read((char*)&buffer,sizeof(char));
buffer=(buffer+7)%256;
file.write((char*)&buffer, sizeof(char));
}
我应该在读完之后将文件指针取回一个字节:
file.seekg(-1, ios::cur);
提前致谢。
答案 0 :(得分:6)
是。正如您在问题中所建议的那样,如果要覆盖先前读取的字节,则需要使用seekg调整文件指针的位置。每次读取后,文件指针将位于读取字节之后。
答案 1 :(得分:2)
您应该将指针移回先前读取的字节数量;所以用char -1。
file.seekg(-1, std::ios::cur);
请注意,在修改数据时,它必须具有相同的字节大小,否则您将覆盖文件中的其他数据。
答案 2 :(得分:1)
读写使用相同的位置指针。因此,如果您希望能够读取连续值,要重写一个值,您需要将指针倒回到已读取的位置,对吗?
那就是说,在你的情况下,读取数据块然后将它们转换成内存然后再写回来可能会更有效。
答案 3 :(得分:0)
首先,您必须始终检查实际打开的文件:
file.open(path, ios::in|ios::out|ios::binary|ios::ate);
if ( ! file.is_open() ) {
throw "open failed";
}
然后你必须始终检查读数&amp;写道,你希望工作有效:
if ( ! file.read((char*)&buffer,sizeof(char)) ) {
throw "read failed";
}
最后,您应该检查您使用的打开标志组合是否在您的特定平台上有效 - 请参阅Why can't I read and append with std::fstream on Mac OS X?进行一些讨论 - 我建议您删除代码中的ios :: ate标志