read()和fread()的区别--实例分析

简介: 当我们在linux系统下写程序的时候,经常会读文件或者写文件,既然要操作文件,就会用文件操作函数,其中涉及读写的不乏有read/write或者fread/fwrite,但是我们应该选择哪一种呢,少安毋躁,在决定选用哪一种之前,先让我们看看它们有哪些不同点,然后再做决定,你说呢?...

当我们在linux系统下写程序的时候,经常会读文件或者写文件,既然要操作文件,就会用文件操作函数,其中涉及读写的不乏有read/write或者fread/fwrite,但是我们应该选择哪一种呢,少安毋躁,在决定选用哪一种之前,先让我们看看它们有哪些不同点,然后再做决定,你说呢?

一、  freadread的不同点

1

read/write  操作文件描述符 (int)
fread/fwrite 
操作文件流   (FILE*)

2
fread/fwrite 
调用 read/write
read/write是系统调用,要自己分配缓存,也就是说效率要自己根据实际情况来控制。
fread/fwrite是标准输入/输出函数,不需要自己分配缓存,对于一般情况具有较高的效率。

 

 

二、   实例分析:
2.1 
待测文件,大小是8K,如图1
                    
                                                     图1

说明:待测文件可以用自动生成,或者手动编辑一个,最好是尝试用前者。

 

2.2   read读取待测文件test.txt

通过分析计算,如果用read读待测文件,且只分配2K的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。

好的,接下来我们通过实例来验证,验证程序代码如图2
                                                                               图2

编译运行,通过结果验证,如图3、图4、图5、图6

                            
                                                                                              图3
                            
                                                                                    图4
                           
                                                                                   图5
                          
                                                                                 图6
             说明:上面的输出结果,是预先在验证程序里写好的。

 strace命令跟踪验证如下:
           
                                       图7
           
                                            图8
           
                                             图9
           
                                            图10

2.3   fread读取待测文件test.txt

      如果用fread/fwrite,则系统自动分配缓存(一般大于8K),则读出此文件只要一次系统调用从磁盘上读出。也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。如果程序对内存有限制,则用read/write比较好。

 

验证程序代码如图11
                            

                                                                   图11

编译运行结果如图12,验证结果
                          

                                                                  图12


strace命令跟踪验证如图13

                                   
                                                                                      图13

以上即为今天对这两种读文件方式的实例分析,接下来我会继续做写文件的分析。




目录
相关文章
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
1172 2
|
安全 程序员 API
|
自然语言处理 IDE 测试技术
通义灵码史上最全使用教程:秀一秀AI编程新肌肉
通义灵码是阿里云推出的一款智能编码辅助工具,基于通义大模型,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码优化、注释生成、代码解释、研发智能问答、异常报错排查等功能。它支持 Visual Studio Code 和 JetBrains IDEs,适配多 IDE 原生设计,帮助开发者高效、流畅地编码。官方提供了详细的下载和安装指南,以及丰富的功能介绍和使用指南。
4306 4
|
11月前
|
计算机视觉 Python
PIL图像转换为Numpy数组:技术与案例详解
本文介绍了如何将PIL图像转换为Numpy数组,以便利用Numpy进行数学运算和向量化操作。首先简要介绍了PIL和Numpy的基本功能,然后详细说明了转换过程,包括导入库、打开图像文件、使用`np.array()`或`np.asarray()`函数进行转换,并通过打印数组形状验证转换结果。最后,通过裁剪、旋转和缩放等案例展示了转换后的应用,以及如何将Numpy数组转换回PIL图像。此外,还介绍了处理base64编码图像的完整流程。
432 4
|
Shell Linux 编译器
Linux Makefile 全面教程:使用 Makefile 进行项目管理和构建
Linux Makefile 全面教程:使用 Makefile 进行项目管理和构建
1611 0
|
C语言 Linux
linux系统的glibc是什么?为什么很重要?
【6月更文挑战第3天】linux系统的glibc是什么?为什么很重要?
1424 2
|
存储 缓存 安全
深入理解内存映射:mmap映射的背后原理以及和共享内存的差异
深入理解内存映射:mmap映射的背后原理以及和共享内存的差异
4679 0
|
算法 Unix Linux
Linux进程与信号:正常与异常的退出机制探索
Linux进程与信号:正常与异常的退出机制探索
996 1
|
索引 存储 C语言
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
603 0
【汇编】[bx+idata]的寻址方式、SI和DI寄存器
|
存储 弹性计算 安全
阿里云服务器8核16G配置可选实例规格、收费标准及2024年优惠价格参考
阿里云服务器8核16G配置多少钱?可选实例规格有哪些?2024年的优惠价格是多少?根据阿里云2024年的收费标准及活动价格来看,8核16G配置云服务器的价格为3084.36元1年。阿里云服务器8核16G配置可选的规格有二十几个,不同实例的价格有所不同,下面是8核16G配置可选实例规格详解及优惠价格表。
2007 0
阿里云服务器8核16G配置可选实例规格、收费标准及2024年优惠价格参考