[英]Looping in a fwrite call until the buffer size is written C/C++
我正在設計一個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
請求的方法,進行一些文件傳輸並將文件內容寫入本地文件。 我不確定這種方法是否有效。 你能告訴我這種方法是否有效,或者我可能遇到的潛在問題? 如果有更好的方法? 謝謝
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)) {
...
}
}
}
我認為您正在尋找的是強大的i / o。 此鏈接和強大的io包可能對您有所幫助: http : //csapp.cs.cmu.edu/public/ch10-preview.pdf
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.