2012-11-26 48 views
0

我必須做一個程序(用於Linux),其中有一個非常大的索引文件,我必須從文件中搜索和解釋數據。現在的問題是,我只允許隨時緩存文件的x字節(由參數決定),所以如果不是我想要的,我必須從緩存中刪除某些數據。C將文件的一部分讀入緩存中

如果我的理解是正確的,的fopen(R)不會放任何東西在緩存中,只有當我打電話GETC或FREAD(指定尺寸)是否得到緩存。

所以我的問題是,可以說我用的fread和讀取100個字節,但檢查之後,只有100個字節的20包含了我所需要的數據;我如何從緩存中刪除無用的80字節(或覆蓋它)以便從文件中讀取更多內容。

EDIT通過緩存我的意思是存儲在存儲器中的數據,這使問題更容易

+0

我懷疑你有些困惑。你能詳細說明這種情況下「緩存」的意思嗎?你是指O/S緩存還是其他的東西? –

回答

2

fread的第一個參數是一個指向的內存塊。所以關於這一點的方法是將該指針設置爲您想要寫入的內容。例如,假設你想保留字節20-40並覆蓋其他所有內容。在開始你可以或者a)調用fread與20的長度然後再打開buffer[40]大小爲60調用它,或者b)你可以通過整理開始(即複製要保持到開始字節),然後調用fread用指向下一節的指針。

-1

要放棄用fopen()打開的文件的讀緩衝區,可以使用fflush()。另請注意,您可以使用setvbuf()來控制緩衝區大小。

但是,如果您必須對緩衝進行精確控制,則應該考慮使用open/read(而不是fopen/fread)。

+0

setvbuf用於C庫完成的流緩衝。同樣,fflush * only *在這些緩衝區上運行。它們與O/S實現的緩存無關。 –

+0

是的,但標準C庫總是進行緩衝(它具有BUFSIZ的默認緩衝區大小)。如果他想要控制緩衝,那就是做這件事的方法。 –

+0

他談到緩存,但我想理論上他有可能是C標準庫維護的緩衝區...... –

2

爲什麼要微調管理緩存?其次,是什麼讓你覺得你可以?程序的命令行中沒有指定參數可以控制緩存管理器在內部執行什麼操作 - 它可能決定將整個文件讀入RAM中,它可能決定不讀取它,也可能決定拋出一個派對。你對它的任何控制都會使用低級API /系統調用,並且不會非常精細。

+0

這就是我的教授作爲這項任務的要求之一。我認爲這很愚蠢,因爲我認爲只要你可以預見地記住內存,就認爲緩存的全部內容不會被注意到。 –

+1

你需要回到教授身邊,問他在這裏「緩存」意味着什麼*案件。坦率地說,如果他希望你微調O/S緩存,他是個白癡。而且你可以隨意告訴他我說的那樣。 –

+0

在更仔細地重讀方向之後,它將數據加載到我受限制的內存中,他只是將其稱爲緩存,我想這就是我的困惑來自的地方。我的錯誤 –

1

我想你可能會對這些要求感到困惑,或者是把它們交給你的人。您似乎指的是由操作系統管理的緩存,而不必擔心應用程序需要擔心。操作系統將確保它不會自動增長過大。

「緩存」的其他含義是您自己創建的緩存,或者您創建的用於在處理內容時將其暫時保存在內存中的任何內容。這個應該相當容易管理你自己,只需不爲該緩衝區分配太多內存。