C++ C++;复制文件。数据不足
我正试图复制一个文件,但不管我怎么做,副本似乎短了几个字节 _文件是设置为二进制模式的ifstreamC++ C++;复制文件。数据不足,c++,file,copy,C++,File,Copy,我正试图复制一个文件,但不管我怎么做,副本似乎短了几个字节 _文件是设置为二进制模式的ifstream void FileProcessor::send() { //If no file is opened return if(!_file.is_open()) return; //Reset position to beginning _file.seekg(0, ios::beg); //Result buffer char * buffer
void FileProcessor::send()
{
//If no file is opened return
if(!_file.is_open()) return;
//Reset position to beginning
_file.seekg(0, ios::beg);
//Result buffer
char * buffer;
char * partBytes = new char[_bufferSize];
//Packet *p;
//Read the file and send it over the network
while(_file.read(partBytes,_bufferSize))
{
//buffer = Packet::create(Packet::FILE,std::string(partBytes));
//p = Packet::create(buffer);
//cout<< p->getLength() << "\n";
//writeToFile(p->getData().c_str(),p->getLength());
writeToFile(partBytes,_bufferSize);
//delete[] buffer;
}
//cout<< *p << "\n";
delete [] partBytes;
}
在这种情况下,我试图复制一个zip文件。
但在记事本中打开原件和副本时,我注意到,虽然它们看起来相同,但在副本缺少几个字节的地方,结果却不同
有什么建议吗?您不希望总是执行
writeToFile(partBytes,\u bufferSize)代码>因为(在末尾)读取的字节数可能小于\u bufferSize
。此外,正如在这个答案的评论中指出的那样,ifstream
一旦达到EOF就不再是“真的”,因此最后一个块不会被复制(这是您发布的问题)。相反,使用gcount()
获取读取的字节数:
do
{
_file.read(partBytes, _bufferSize);
writeToFile(partBytes, (unsigned int)_file.gcount());
} while (_file);
比较zip文件,您可能需要考虑使用非文本编辑器来进行比较;是一个很棒的(免费)十六进制编辑器,带有文件比较选项。
您是在从一种媒体复制到另一种媒体吗?也许不同的部门规模造成了明显的奇怪
如果_bufferSize没有均匀地划分为文件大小,可能会导致写入额外的字节。您假设文件大小是\u bufferSize
的倍数。您必须在以下时间后检查缓冲区中剩余的内容:
while(_file.read(partBytes,_bufferSize)) {
writeToFile(partBytes,_bufferSize);
}
if(_file.gcount())
writeToFile(partBytes, _file.gcount());
当while循环由于遇到EOF而无法读取_bufferSize字节时,它将终止
对read()的最后一个调用可能读取了一些数据(只是缓冲区不够满),但代码会忽略它
循环结束后,您需要检查_file.gcount(),如果它不是零,则写出剩余的字节。次要建议:不要以\u
开头变量名,这些变量名的大多数用法都保留给编译器或标准库。尽管我希望应用自己的约定,这不取决于我。有趣的是,从那个方法到int的转换并不存在。。。?有什么想法吗?@Sidar:是的,我一定在想另一个read()
函数,对不起。我已经用(希望)正确的代码更新了我的答案!另外-我相信istream::read
可能会返回一个对象,如果该对象读取的字节数小于\u bufferSize
字节,则该对象将转换为false,在这种情况下,while
的主体将不会被执行。我认为这是不正确的。如果最后一次读取是部分的,则不会调用writeToFile
,因此问题将持续存在。没有成功。当代码运行时,会出现相同的结果。最终,需要将部分字节发送到数据包中,以便通过网络发送。因此writeFile不是直接调用的,此时它都是从桌面目录写入的。有趣的是,我缺少字节。是的!我以前试过,但出于某种原因,我总是出界。但这是有效的
while(_file.read(partBytes,_bufferSize)) {
writeToFile(partBytes,_bufferSize);
}
if(_file.gcount())
writeToFile(partBytes, _file.gcount());