【发布时间】:2012-07-16 22:58:37
【问题描述】:
我正在设计一个 C++ 回调函数,它将 size_t size 字节从缓冲区写入 C++ 中的文件。但是,为了理智,我必须检查fwrite 是否返回errno,例如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 字节已写入文件。我使用fwrite 而不是任何其他方法的原因是因为函数write_data 作为回调传递给执行HTTP 请求的方法,进行一些文件传输并将文件内容写入本地文件.
我不确定这种方法是否有效。你们能告诉我这种方法是否可行,或者我可能遇到的潜在麻烦吗?如果有更好的方法?
谢谢
【问题讨论】:
-
为什么在 C++ 中使用 C 函数?文件 IO 处理得更好是 C++ imo。
-
@AlexandreP.Levasseur 我使用 fwrite 而不是任何其他方法的原因是因为函数 write_data 作为回调传递给执行 HTTP 请求的方法,进行一些文件传输并写入文件内容到本地文件
-
你为什么要重试
EACCESS?什么样的条件会改变才能让它在未来发挥作用? -
用while循环替换if。如有必要,设置一个睡眠功能。
-
谁打开了输出文件,你还是库?如果是你,你可以很容易地使用 C++
fstream而不是 CFILE*。您只需要从void*来回转换fstream对象的地址。