C++ 停止和启动二进制文件的读取/复制

C++ 停止和启动二进制文件的读取/复制,c++,io,binary,C++,Io,Binary,所以我试图复制一个二进制文件到某一点…停止…执行一些操作,然后将原始二进制文件中的剩余内容复制到我的新二进制文件中。但是,当我执行第二次读取操作时,我的读取缓冲区是空的。有人能指出我做错了什么吗?非常感谢 ifstream fin; fin.open(argv[1], ios::in | ios::binary); ofstream fout("test.bin", ios::out | ios::binary); int position = getPositionX(); fin.see

所以我试图复制一个二进制文件到某一点…停止…执行一些操作,然后将原始二进制文件中的剩余内容复制到我的新二进制文件中。但是,当我执行第二次读取操作时,我的读取缓冲区是空的。有人能指出我做错了什么吗?非常感谢

ifstream fin;
fin.open(argv[1], ios::in | ios::binary);

ofstream fout("test.bin", ios::out | ios::binary);

int position = getPositionX();
fin.seekg(position);
streamoff initialCopyLength = fin.tellg();
char * readBuffer = new char[initialCopyLength];
fin.seekg(0, fin.beg);
fin.read(readBuffer, initialCopyLength);
fout.write(readBuffer, initialCopyLength);

///perform some operations, then copy out the rest of the binary

int currentPosition = fin.tellg();
fin.seekg(0, fin.end);
streamoff length = fin.tellg();
readBuffer = new char[length];
fin.read(readBuffer, length);
//write out last part of file
fout.write(readBuffer, length);
fin.close();
fout.close();

使用
fin.seekg(0,fin.end)搜索到文件末尾
但在尝试
read()
之前,您永远不会返回到读取位置,因此您在结尾时不会读取任何内容。您需要在
read()
之前再打一个
seekg
电话,这样您就可以回到原来的位置了。添加

fin.seekg(currentPosition, fin.beg);
会让你回到原来的地方

你也犯了一个错误

streamoff length = fin.tellg();
这是给你的总文件大小。为了得到你所需要的东西

streamoff length = fin.tellg() - currentPosition;

相关:你忘了检查阅读是否成功。这绝对是解决方案的一部分。现在复制的文件末尾追加了400万个额外的“Í”……我只能假设读取缓冲区太大了?现在完全有道理了!谢谢你的帮助!!