我正在使用fgets
讀取相當大的文本行(最多128K)文本。我看到過多的上下文服務器上的開關,使用strace
我看到以下內容:使fgets在Linux上發出更長的read()調用
read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096
即fgets
一次讀取的4096個字節塊。有什麼方法可以控制撥打read()
時大塊fgets
的用途?
我正在使用fgets
讀取相當大的文本行(最多128K)文本。我看到過多的上下文服務器上的開關,使用strace
我看到以下內容:使fgets在Linux上發出更長的read()調用
read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096
即fgets
一次讀取的4096個字節塊。有什麼方法可以控制撥打read()
時大塊fgets
的用途?
setvbuf
將是明顯的起點。
功能fgets()
是標準輸入輸出包的一部分,因此它必須以一種方式,是與同樣使用fgetc()
,fscanf()
,fread()
等等一致緩衝(或不)的輸入流。這意味着緩衝區本身(如果流被緩衝)是FILE
對象的屬性。
通過調用setvbuf()
可以向庫提示是否存在緩衝區,如果緩衝了,緩衝區有多大。
圖書館實施有相當多的緯度來忽略提示,並做它認爲最好的,但通常會接受兩個「合理」的冪的緩衝區。你已經注意到,默認值是4096,這顯然比最佳值要小。
如果在實際文件上打開流,則默認緩衝流。它在管道,FIFO,TTY或其他任何設備上的緩衝可能具有不同的默認值。
我想要一個*大*的緩衝區,但發佈讀取較小的塊。與setvbuf我不得不設置緩衝區的最大大小和讀取的緩衝區的大小發出(例如,128K的緩衝區,sissues讀取128k塊,實際上結果表明執行比讀取8192字節差,就我而言) – Anonym 2010-09-12 11:21:15