3

C++ でバッファからファイルにバイトC++を書き込むコールバック関数を設計しています。size_t sizeただし、正気を保つために、 がなどをfwrite返すかどうかを確認する必要があります。関数自体はとの間のインターフェースです。案の定、擬似コード (ほぼ本物のコード) が書かれています。errnoEACESSCC++

static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream){
     int nwritten = size;
     while(nwritten > 0){
          int written = fwrite(ptr, size, nmemb, (FILE*)stream);
          if(written < 0 && errno == EACESS){
                  // try again
                  written = 0;
          }
          /* check some other errors which may be recoverable 
          nwritten -= written;
     }

関数自体はlibcurlから呼び出されます。

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);

ポイントは、size_t written = sizeバイトがファイルに書き込まれたことを確認することです。fwrite代わりに他のメソッドを使用している理由は、関数write_dataがコールバックとしてHTTPリクエストを実行し、ファイル転送を行い、ファイルの内容をローカル ファイルに書き込むメソッドに渡されるためです。このアプローチが機能するかどうかはわかりません。このアプローチが機能するかどうか、または潜在的な問題を教えてください。より良いアプローチがあれば?ありがとう

4

2 に答える 2

1

fwrite書き込まれたメンバーの数を返すため、次のように、次のようにメンバーを進める必要がありますptr

size_t done = 0;

while (done < nmemb) {
    size_t written = fwrite((char*)ptr + done * size, size, nmemb - done, (FILE*)stream);
    done += written;
    if (done < nmemb) {
        /* Not all has been written. Some kind of error may have occurred. */
        if (ferror((FILE*)stream)) {
            ...
        }
    }
}
于 2012-07-16T23:21:34.250 に答える
0

あなたが探しているのは堅牢な i/o だと思います。このリンクと堅牢な io パッケージが役立つかもしれません: http://csapp.cs.cmu.edu/public/ch10-preview.pdf

于 2012-07-16T23:41:52.787 に答える