3

我正在设计一个C++回调函数,它将size_t size字节从缓冲区写入 C++ 中的文件。但是,为了理智,我必须检查是否fwrite返回 aerrno例如EACESS. 函数本身是 和 之间的C接口C++。果然,我写了一个伪代码(几乎是真实的代码):

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字节写入文件。我使用 afwrite而不是任何其他方法的原因是因为该函数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 回答