我希望編寫一個高效的C程序,它會生成一個文件的副本。似乎沒有執行此操作的功能(如rename)。我打算在stdio.h中使用fscanf和fprintf,但是他們的描述並沒有說明如何或如何對它們進行緩衝。它們是否緩衝在不同的緩存級別之間? (我假設磁盤到內存緩衝區由操作系統處理)fscanf和fprintf緩存在C中嗎?
0
A
回答
1
當您使用fopen
打開文件時,它將被完全緩衝。
使用setvbuf
(reference),您可以在對文件執行任何其他操作之前更改緩衝區。
在FILE
對象上使用任何常規I/O函數都會利用緩衝。
如果你只是複製數據,你將會進行順序讀寫,並不一定需要緩衝。但要做到這一點,需要爲I/O操作選擇合適的塊大小。傳統上,這與磁盤扇區的大小(4096字節)有關,但該值不是未來的證明。 fopen
使用的默認值是BUFSIZ
。
與任何優化一樣,構建實際測試來驗證您的性能增益(或損失)。
最後,爲了獲得最快的I/O,您可能必須使用特定於操作系統的API。 C I/O函數只是映射到這些API的一般情況,但可能存在您無法通過C庫進行控制的操作系統的特殊性能設置。在爲Windows編寫快速的AVI寫入程序時,我當然遇到了這個問題。使用特定於平臺的I/OI能夠實現磁盤的最大讀/寫速度:兩倍於緩衝I/O(<stdio.h>
)或本機AVI API的速度,比傳統C無緩衝I/O快大約20% 。
0
printf
和scanf
功能家族都是同一個緩衝「接口」的一部分。 man 3 stdio
:
標準I/O庫提供了一個簡單高效的緩衝 流I/O接口。輸入和輸出被映射爲邏輯數據流 ,並且物理I/O特徵被隱藏。下面列出了 函數和宏;更多的信息是 可從各個手冊頁獲得。
如果你想避免緩衝,你將不得不使用不同的C庫。
相關問題
- 1. 在C中一起使用fscanf和fprintf
- 2. 由fscanf和fprintf在C程序中的文本文件改變的值
- 3. 在XCode中存在fprintf C的問題
- 4. 的fscanf(c)中 - %s和%C
- 5. 用fprintf和fscanf替換文本文件中的字符串
- 6. C fscanf和指針
- 7. 爲什麼fprintf和fscanf不能用於管道
- 8. 在C中使用fscanf
- 9. C++中fprintf和vfprintf有什麼區別?
- 10. fscanf fscanf一個數字並將每個數字存儲在數組c中
- 11. Nongreedy fscanf和緩衝區溢出檢查c
- 12. C fprintf顏色
- 13. /dev/shm中的內存可以緩存在CPU緩存中嗎?
- 14. 你能清除C#中的緩存和優化嗎?
- 15. 的fscanf用c
- 16. fscanf C++等效
- 17. 頁面輸出緩存存儲在ASP.NET緩存對象中嗎?
- 18. 在C#中緩存(ASP.NET)
- 19. C:緩衝區溢出中fscanf的分段錯誤?
- 20. 使用fscanf和printf的C會返回奇怪的值嗎?
- 21. 當使用不同的文件句柄時,fprintf和fscanf是否可重入
- 22. 寫3個整數文件並恢復他們回來使用fprintf和的fscanf
- 23. fprintf如何在C++中工作?
- 24. 在RPC C程序中的fprintf問題
- 25. C#相當於fprintf
- 26. 問題的fscanf的在C
- 27. fdopen和fprintf
- 28. dataWithContentsOfURL緩存嗎?
- 29. Typeface.createFromAsset()緩存嗎?
- 30. LRU緩存在C++