gpt4 book ai didi

c++ - 在 fwrite 调用中循环,直到写入缓冲区大小 C/C++

转载 作者:太空狗 更新时间:2023-10-29 23:07:48 35 4
gpt4 key购买 nike

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

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

最佳答案

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)) {
...
}
}
}

关于c++ - 在 fwrite 调用中循环,直到写入缓冲区大小 C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513799/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com