0

データのブロックを読み取ってファイルを送信し、それを元に戻すことでファイルをコピーしたいと思います。送信は問題の一部ではないので、コードでは省略しました。これは、任意のタイプのファイルと任意のpiece_lengthsで機能するはずです。

これは単なる前段階です。最後に、データブロックは順番に選択するのではなく、ランダムに選択する必要があります。別のデータブロックを受信するまでに時間がかかる場合があります。

私は、この例が次の場合に意味があることを知っていsize % piece_length != 0ます。

もう一方の端にある元のファイルと同じサイズのクラッシュしたファイルが表示されます。誰かが問題を見ていますか?

int main ()
{
string file = "path/test.txt"
string file2 = "path2/test.txt";

std::ifstream infile (file.c_str() ,std::ifstream::binary);
//get size of file
infile.seekg (0,infile.end);
long size = infile.tellg();
infile.seekg (0);   
size_t piece_length = 5;



for (int i = 0; i < ((size / piece_length) + 1); i++)
{
    if ( i != (size / piece_length))
    {
        std::ifstream infile (file.c_str() ,std::ifstream::binary);
        infile.seekg((i * piece_length) , infile.beg);          
        char* buffer = new char[piece_length];
        infile.read(buffer, piece_length);
        infile.close();
        std::ofstream outfile (file2.c_str() ,std::ofstream::binary);
        outfile.seekp((i * piece_length), outfile.beg);
        outfile.write(buffer, piece_length);
        outfile.close();
    }
    else 
    {
        std::ifstream infile (file.c_str() ,std::ifstream::binary);
        infile.seekg((i * piece_length) , infile.beg);          
        char* buffer = new char[size % piece_length];
        infile.read(buffer, size % piece_length);
        infile.close();
        std::ofstream outfile (file2.c_str() ,std::ofstream::binary);
        outfile.seekp((i * piece_length), outfile.beg);
        outfile.write(buffer, size % piece_length);
        outfile.close();
        }
}
return 0;
}
4

1 に答える 1

1

outfile特定の質問に答えるには、フラグで開く必要がありますios::in | ios::out。そうしないと、デフォルトで書き込み専用モードになり、ファイルに既にあったものを破棄します。詳細については、この回答を参照してください: Write to the middle of existing binary file c++

ただし、次のことを検討することをお勧めします。

  • ファイルの末尾にパーツを書き込むだけの場合は、ios::app(追加) を使用します。探す必要すらない。
  • 再度開く必要はなくinfileoutfile再利用するだけです。
  • を再利用することもできますbufferdelete彼らに覚えておいてくださいstd::vector
于 2013-03-11T12:37:07.933 に答える