Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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++ C++;复制文件。数据不足_C++_File_Copy - Fatal编程技术网

C++ C++;复制文件。数据不足

C++ 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

我正试图复制一个文件,但不管我怎么做,副本似乎短了几个字节

_文件是设置为二进制模式的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;
    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());