0

そこで、学校のプロジェクト用に独自のカスタム FTP クライアントを作成しています。群がる FTP クライアントですべてが動作するように管理し、最後の小さな部分に取り掛かっています... .part ファイルをメイン ファイルに読み込みます。私は2つのことをする必要があります。(1)これを取得して、各ファイルを適切に読み取り、最終ファイルに書き込みます(2)各ファイルの処理が完了したら、パーツファイルを削除するコマンド。

以下に書いた連結関数を修正するのを手伝ってもらえますか? EOF まで各ファイルを読み込んでから、次のファイルに進むのが正しいと思いました。

この場合*numOfThreadsは 17 です。594542592 バイトではなく、4742442 バイトのファイルになりました。ありがとうございます。他にも有益な情報を提供できれば幸いです。

編集: 以下のコメントのコードを修正しました。

    std::string s = "Fedora-15-x86_64-Live-Desktop.iso";
    std::ofstream out;
    out.open(s.c_str(), std::ios::out);
    for (int i = 0; i < 17; ++i)
    {
            std::ifstream in;
            std::ostringstream convert;
            convert << i;
            std::string t = s + ".part" + convert.str();
            in.open(t.c_str(), std::ios::in | std::ios::binary);
            int size = 32*1024;
            char *tempBuffer = new char[size];
            if (in.good())
            {
                    while (in.read(tempBuffer, size))
                            out.write(tempBuffer, in.gcount());
            }
            delete [] tempBuffer;
            in.close();
    }
    out.close();
    return 0;
4

1 に答える 1

3

コピー ループのほとんどすべてに問題があります。

while (!in.eof())

これは壊れています。それ以上言うことはありません。

       bzero(tempBuffer, size);

これはかなり無害ですが、まったく無意味です。

            in.read(tempBuffer, size);

これは「ほとんど」の部分です。つまり、明らかに壊れていない部分です。

            out.write(tempBuffer, strlen(tempBuffer));

長さを決定するために使用する必要はありません。これはstrlen、NUL で終了する (C スタイルの) 文字列のみを対象としています。(明らかにそうであるように)読み取ったデータにゼロバイトが含まれている可能性がある場合(文字列の終わりを知らせるためにゼロバイトのみを使用するのではなく)、これは単に間違ったサイズを生成します。

通常やりたいことは、次のようなループです。

while (read(some_amount) == succeeded)
    write(amount that was read);

C++ では、通常は次のようになります。

while (infile.read(buffer, buffer_size))
    outfile.write(buffer, infile.gcount());

newを使用してバッファにメモリを割り当てているが、 を使用していないためdelete、関数がメモリをリークしていることにも注意してください。おそらく、これを行わないほうがよいでしょnewう。ここでは、配列またはベクトルが明らかに代替手段になります。

編集:なぜwhile (infile.read(...))機能するのかについてreadは、ストリームへの参照を返します。ストリームは、ブール値として解釈できる ( boolC++11 の場合) または(C++03 の場合) への変換を提供します。void *その変換演算子はストリームの状態を返すので、読み取りに失敗した場合は と解釈されますfalseが、成功した場合は と解釈されtrueます。

于 2013-02-13T05:58:24.527 に答える