我希望编写一个高效的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. 由fscanf和fprintf在C程序中的文本文件改变的值
- 2. 的fscanf(c)中 - %s和%C
- 3. 在XCode中存在fprintf C的问题
- 4. 为什么fprintf和fscanf不能用于管道
- 5. fscanf fscanf一个数字并将每个数字存储在数组c中
- 6. Nongreedy fscanf和缓冲区溢出检查c
- 7. /dev/shm中的内存可以缓存在CPU缓存中吗?
- 8. fscanf C++等效
- 9. 你能清除C#中的缓存和优化吗?
- 10. 页面输出缓存存储在ASP.NET缓存对象中吗?
- 11. C:缓冲区溢出中fscanf的分段错误?
- 12. 使用fscanf和printf的C会返回奇怪的值吗?
- 13. fprintf如何在C++中工作?
- 14. 在RPC C程序中的fprintf问题
- 15. 问题的fscanf的在C
- 16. C#相当于fprintf
- 17. Typeface.createFromAsset()缓存吗?
- 18. 在c中使用fscanf()读取多行
- 19. C# - 缓存加载缓存
- 20. C fscanf跳转值
- 21. 的fscanf多行[C++]
- 22. 缓存和比较文件在C#
- 23. fprintf线程在OS X上安全吗?
- 24. jquery.js在浏览器中缓存吗?
- 25. 在skadate中可以关闭缓存吗?
- 26. 实体默认缓存在jpa中吗?
- 27. fputs vs. fprintf和double
- 28. datomic缓存和缓存未命中
- 29. 使用C#在Redis缓存中扫描缓存密钥#
- 30. 使用fprintf存储流