2017-04-13 86 views
0

我們有接受FILE *(CImg)的庫。出於性能原因,我們希望處理已經在內存中的數據而不訪問磁盤。目標平臺是一種遺憾的是不支持fmemopen窗口(和funopen)內存FILE *(無磁盤訪問)

char* buf = new char[sz]; 

FILE *fp = fopen("C:\\test.dat", "wb"); 
int r = setvbuf(fp, buf, _IOFBF, sz); 

r = fwrite(src_buf, 1, sz, fp);  // Here r contains right size 


fseek(fp, 0, SEEK_END); 
size_t sz2 = ftell(fp);    // sz2 contains right size as well 
rewind(fp); 

// Test (something like this actually is somewhere deep inside library) 
char* read_buf = new char[sz]; 
r = fread(read_buf, 1, sz, fp);  // Zero! 

最終FREAD()不能讀什麼?有什麼建議?

+1

爲什麼用C++標記?這看起來像C. – Dai

+0

有沒有使用內存映射文件的可能性? – user3344003

+1

'fp'被打開爲只寫。 – aschepler

回答

0

對於我們的具體情況,我們發現CImg插件做的事情。

至於原始問題中的示例 - 至少MSVC運行時會將寫入內容刷新到磁盤本身。因此,這不是一個有效的替換爲fmemopen()

0

可能是因爲你 「WB」(只寫),而不是 「WB +」 打開(讀+寫)

fopen() function

爲了進一步幫助,您可以#包括errno.h中,並打印出錯誤代碼和字符串。

printf("errno: %d, error:'%s'\n", errno, strerror(errno)); 
+0

謝謝!這幫助我們讀取數據,但仍然會將數據刷新到磁盤。在我們的例子中,RAM驅動器可能是解決方案 – Victor

+0

@Victor查看snprintf的C運行時間源。 IIRC,它通過內存緩衝區執行僞造的FILE。沒有更多的窗口框我會找到更好的參考。 –

0

您可以使用POSIX-2008功能fmemopen()open_memstream():第一種是有用的傳球在內存中的數據到庫中,第二個是獲取有用將數據從庫中移出到內存緩衝區中,該緩衝區將由open_memstream()分配以適合數據的實際大小。