2010-08-31 48 views
5

我正在使用fgets讀取相當大的文本行(最多128K)文本。我看到過多的上下文服務器上的開關,使用strace我看到以下內容:使fgets在Linux上發出更長的read()調用

read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096 

fgets一次讀取的4096個字節塊。有什麼方法可以控制撥打read()時大塊fgets的用途?

回答

7

setvbuf將是明顯的起點。

+0

我想要一個*大*的緩衝區,但發佈讀取較小的塊。與setvbuf我不得不設置緩衝區的最大大小和讀取的緩衝區的大小發出(例如,128K的緩衝區,sissues讀取128k塊,實際上結果表明執行比讀取8192字節差,就我而言) – Anonym 2010-09-12 11:21:15

2

功能fgets()是標準輸入輸出包的一部分,因此它必須以一種方式,是與同樣使用fgetc()fscanf()fread()等等一致緩衝(或不)的輸入流。這意味着緩衝區本身(如果流被緩衝)是FILE對象的屬性。

通過調用setvbuf()可以向庫提示是否存在緩衝區,如果緩衝了,緩衝區有多大。

圖書館實施有相當多的緯度來忽略提示,並做它認爲最好的,但通常會接受兩個「合理」的冪的緩衝區。你已經注意到,默認值是4096,這顯然比最佳值要小。

如果在實際文件上打開流,則默認緩衝流。它在管道,FIFO,TTY或其他任何設備上的緩衝可能具有不同的默認值。