【问题标题】:Looping in a fwrite call until the buffer size is written C/C++在 fwrite 调用中循环,直到写入缓冲区大小 C/C++
【发布时间】:2012-07-16 22:58:37
【问题描述】:

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

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 请求的方法,进行一些文件传输并将文件内容写入本地文件. 我不确定这种方法是否有效。你们能告诉我这种方法是否可行,或者我可能遇到的潜在麻烦吗?如果有更好的方法? 谢谢

【问题讨论】:

  • 为什么在 C++ 中使用 C 函数?文件 IO 处理得更好是 C++ imo。
  • @AlexandreP.Levasseur 我使用 fwrite 而不是任何其他方法的原因是因为函数 write_data 作为回调传递给执行 HTTP 请求的方法,进行一些文件传输并写入文件内容到本地文件
  • 你为什么要重试EACCESS?什么样的条件会改变才能让它在未来发挥作用?
  • 用while循环替换if。如有必要,设置一个睡眠功能。
  • 谁打开了输出文件,你还是库?如果是你,你可以很容易地使用 C++ fstream 而不是 C FILE*。您只需要从void* 来回转换fstream 对象的地址。

标签: c++ c io libcurl


【解决方案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)) {
            ...
        }
    }
}

【讨论】:

  • 您是否有参考资料可供我查看,以查看 fwrite 返回的错误?
  • 原来我错了。 fwrite 不返回错误代码。我已经编辑了我的答案。
  • 您需要检查返回值是否为零。如果是,您可能想跳出while 循环。
【解决方案2】:

我认为您正在寻找的是强大的 i/o。 此链接和强大的 io 包可能会对您有所帮助:http://csapp.cs.cmu.edu/public/ch10-preview.pdf

【讨论】:

    猜你喜欢
    • 2012-09-12
    • 2011-06-12
    • 1970-01-01
    • 2011-11-26
    • 2017-04-07
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多