2011-11-28 30 views
0

在研究強制文件被儘可能快地寫_commit問題,我已經看到下面的代碼塊在幾個地方:與FD()

_commit(outputFile.rdbuf()->fd()); 

其中OUTPUTFILE是的std :: ofstream的對象。我基本上是做以下幾點:

std::ofstream outputFile; 
outputFile.write((char*)blocks, sizeof(blocks)); 
outputFile.flush(); 
_commit(outputFile.fd()); 
outputFile.close(); 

塊是一個簡單的char數組數組。我正在做的是寫入一個char數組數組來表示一個二進制文件的內容,然後將該數組推送到文件本身。我需要儘可能快地寫入文件,因爲介質的可靠性不如閃存,而且停電的機率非常高。

當我嘗試編譯,我收到關於_commit行代碼以下錯誤:

error C2039: 'fd' : is not a member of 'basic_ofstream<char,struct std::char_traits<char> >' 

我應該如何去獲得的OUTPUTFILE文件描述符,並把它傳遞給_commit?

編輯:我改變了上面的代碼,以反映使用ofstream.fd(),這應該是ofstream的公衆成員。

+4

看一眼'basic_filebuf'類確認它沒有'fd()'成員,所以有人使用非=標準擴展。 –

+0

我想我應該修改我的問題,只是要求獲取outputFile的文件描述符並將其傳遞給_commit。 –

+1

標準C++中沒有這樣的東西,也沒有'_commit'函數。非標準擴展根據定義依賴於編譯器。 –

回答

3

有人應該寫這個答案。他們沒有,我會偷走他們的榮耀。 :-)

文件描述符是依賴於實現的。有些系統可能沒有。所以C++標準沒有定義從fstreamfilebuf得到它的任何方法。

您示例中的_commit函數絕對取決於實現。一個重要的提示是名字以下劃線開頭。有點谷歌顯示_commit只適用於Windows。

爲了得到你想要的,你可以寫你自己的類從streambuf派生。這個自定義類將以您想要使用的低級術語(Windows,POSIX)實現IO,並且可以提供額外的功能來返回文件描述符或將數據刷新到磁盤。

要使用自定義類作爲流,您將創建一個ostream並將它傳遞給您的streambuf類的指針。

+0

謝謝澄清。我被別的東西搞糊塗了:MSDN顯示fd()是ofstream的成員,它在Intellisense中顯示出來。但是,_commit行會拋出fd不是basic_ostream成員的錯誤。在我看來,這是一個VS非標準的擴展,應該服務於這個目的。我很困惑,爲什麼我顯然不能使用fd()。 –