2012-09-19 35 views
0

我需要一個跨平臺的方式來處理內存緩衝區爲FILE*。我已經看到其他問題,指出沒有可移植的方式來做到這一點(在Linux中fmemopen是我需要的,但它在Windows平臺上失敗)。使用setvbuf使內存緩衝區行爲像FILE *

我試過使用setvbuf,它似乎工作。任何人都可以指出使用setvbuf函數的確切問題嗎?

另外,我已經看到了C標準草案WG14/N1256和7.19.5.6說:

在任何時候所述陣列的內容是不確定的。

我不明白我是否使用自己的緩衝區它的內容如何可以不確定?

編輯:感謝所有的答案。不再使用這種方法。

+0

對不起,我不明白這一點。您可以在C++中使用跨平臺malloc或stringstream。 – rekire

+0

@rekire stringstream正是我的想法,但代碼使用C FILE *代替。 – user803563

回答

2

沒有,沒有可行的方法來做到這一點。

使用setvbuf可能出現工作,但你真的調用未定義的行爲,它會在意想不到的時間以意想不到的方式失敗。正如你所提到的那樣,GNU C庫確實有fmemopen(3)作爲擴展,但它不能移植到非GNU系統。

如果您正在使用某個需要FILE*指針的庫,並且只在內存中擁有所需的數據,則只需將其寫入臨時文件並將句柄傳遞給該文件即可。理想情況下,你的庫應該提供一個替代函數,它需要一個內存指針而不是一個文件指針,但如果不是的話,你運氣不好(你應該向圖書館作者抱怨這個缺陷)。

1

函數setvbuf()用於告訴FILE要用作緩衝區的內存,但它沒有指定如何使用該內存:這取決於實現。

因此,緩衝區的內容在任何時候都是不確定的,如果碰巧爲你工作,這是偶然的。

1

這取決於你想要用緩衝區/文件*做什麼。你當然可以執行簡單的操作並逃避它們,但是你不能保證所有的FILE *操作都可以像你期望的那樣在內存緩衝區中執行。

對不起,是根本不存在的跨平臺的單行得到充分的FILE *特性,我已經嘗試過自己很多次,哈哈

你可以嘗試:

  • #定義包裹特定於操作系統的邏輯
  • 進一步查看您嘗試與之交互的界面。無論如何它只是在緩衝區中播放。然後在緩衝區中拼接。這就是我所做的。
  • 您的技術+信念。
+0

您能否告訴我們簡單的操作是否包含讀寫功能? – user803563

+1

他們確實包括讀/寫,但這不是重點。重點是多少? FILE結構現在將爲您處理您的緩衝區,並允許您執行任何符合其文件尋求義務的任務。您的緩衝區可以隨時清除,也可以保持整個運行狀態。 –