linux fread 头文件,Linux文件操作
Linux中一切都是文件。如普通文件,目录,设备,管道等。
操作这些文件有两种方式,调用系统函数和使用标准I/O库。
一、调用系统函数
1.文件描述符:数值类型,表示打开的文件标识
程序运行时,会首先打开3个文件描述符,0(标准输入文件),1(标准输出文件),2(标准错误文件)
2.系统调用常用函数
1)open函数:打开文件
原型为:
int open(const char *path,intoflags)int open(const char *path,int oflags,mode_t mode)
path:完整的文件路径
oflags:文件访问模式(只读,只写,可读写)
mode:设定文件访问权限
返回值:返回与文件关联的文件描述符,失败返回-1
注意这个描述符是唯一的,不与其他进程共享,文件对应的文件描述符并不是固定的。
2)write函数:写入文件
原型为:
size_t write(int fildes,const void *buf,size_t nbytes);
将buf缓冲区的前nbyts个字节,写入文件描述符files关联的文件中。
返回值:实际写入的字节数,失败返回-1
3)read函数:读取文件
原型为:
size_t read(int fildes,void *buf,szie_t nbytes);
读取文件描述符fildes关联的文件中前nbytes个字节,到buf缓冲区
返回值:实际读取的字节数,失败返回-1
4)close函数:关闭文件
原型为:
int close(int fildes);
返回值:成功返回0,失败返回-1
3.调用系统函数示例
从一个文件中复制数据到另一个文件,代码如下:
copy.c
#include#include
intmain()
{char c='\0';int in=-1,out=-1;in=open("myfile.txt",O_RDONLY);//以只写方式创建文件,若文件不存在则新建一个文件//文件所有者具有读和写权限
out=open("myfile2.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);while(read(in,&c,1)==1)
write(out,&c,1);
close(in);
close(out);return 0;
}
输出结果:
4.标准I/O库
在标准I/O中,使用的是文件流,对应着底层的文件描述符。
文件流是一个指向FILE结构的指针。
I/O库的函数包含在头文件stdio.h中。
1)fopen函数:打开文件
原型为:
FILE* fopen(const char *filename,const char *mode);
与底层open函数类似
返回值:成功返回非空指针,失败返回NULL
2)fread函数:读取文件
原型为:
size_t fread(void *ptr,size_t size,size_t nitems,FILE *stream);
与底层read函数类似
从stream读取nitems个长度为size的数据到ptr指向的缓冲区
返回值:成功读取的字节数,失败返回-1
3)fwrite函数:写入文件
原型为:
size_t fwrite(const void *ptr,size_t size,size_t nitems,FILE *stream);
与底层write函数类似
从ptr指向的缓存区读取nitems个长度为size的数据,并把它们写到stream对应的文件中。
返回值:成功写入的字节数,失败返回-1
4)fclose函数:关闭文件
原型为:
int fclose(FILE *stream);
返回值:成功返回0,失败返回-1
5.标准I/O使用示例
与前例一样,从一个文件中复制数据到另一个文件,只是使用I/O库函数来实现,
代码如下:
#include#include
intmain()
{int c=0;
FILE*pfin =NULL;
FILE*pfout =NULL;
pfin= fopen("myfile.txt","r");
pfout= fopen("myfile2.txt","w");while(fread(&c,sizeof(char),1,pfin))
fwrite(&c,sizeof(char),1,pfout);
fclose(pfin);
fclose(pfout);return 0;
}
输出结果:
程序中的读和写数据可以用库中的其他函数来代替,如fget,fputc等。
6.文件描述符和文件流
一般不要混合使用底层输入输出与高层文件流操作。
调用fileno函数,可以获得文件流使用的底层文件描述符
原型为:int fileno(FILE *stream);
调用fdopen函数,可以在一个已经打开的文件描述符上创建一个新的文件流
原型为:FILE* fdopen(int fildes,const char* mode);
Linux下编程时,一般使用系统调用,而不使用I/O库。
有些操作必须使用系统调用,如创建文件读写锁等。
7.系统调用性能优化
我们使用time命令测试系统调用和I/O库两种方法的运行时间,
结果如下所示:
可以看出,系统调用的效率要明显低于I/O库,这是为什么呢?
因为系统调用时,Linux必须从运行用户代码切换到内核代码,然后再返回用户代码。
而I/O库函数会自动在数据满足数据块长度时,才调用底层系统函数。
系统调用代码优化如下,每次一次性读取和写入N个字节,减少系统调用次数。
copyopt.c
#include#include
intmain()
{char buffer[1024];int in=-1,out=-1;int nread=0;in=open("myfile.txt",O_RDONLY);//以只写方式创建文件,若文件不存在则新建一个文件//文件所有者具有读和写权限
out=open("myfile2.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);while(nread=read(in,buffer,sizeof(buffer))>0)
write(out,buffer,nread);
close(in);
close(out);return 0;
}
使用time测试输出如下:
可以看出,性能得到了提高,甚至超过了使用I/O的性能。
linux fread 头文件,Linux文件操作相关推荐
- linux的头文件下载,Linux内核头文件(linux headers)
更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...
- linux c open fopen freopen 文件操作函数
open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系 ...
- linux gcc编译下的文件读写操作
linux下的文件操作 所有目录 1.文件及文件系统的定义 2.linux文件的类型 3.linux文件的权限 ...
- linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件
网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...
- linux文件系统添加pcm,linux下用sox批量将pcm文件加wav头、批量修改采样率、切音频...
linux下用sox可以给pcm文件加头 例如:test.pcm是不带wav头的pcm文件 $ sox -t raw -c 1 -e signed-integer -b 16 -r 16000 tes ...
- linux c之c语言符合标准的头文件和linux常用头文件
1.C语言符合标准的头文件 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h ...
- grep递归查找头文件_Grep命令教程–如何使用递归查找在Linux和Unix中搜索文件
grep递归查找头文件 grep stands for Globally Search For Regular Expression and Print out. It is a command li ...
- linux语言的说明顺序有哪些,(linux常用头文件详解.doc
(linux常用头文件详解 linux常用头文件详解 POSIX标准定义的头文件??????? 目录项 ???????? 文件控制 ??? 文件名匹配类型 ??? 路径名模式匹配类型 ??????? ...
- linux 常用头文件,(常用头文件详解.doc
(常用头文件详解 linux常用头文件详解 POSIX标准定义的头文件??????? 目录项 ???????? 文件控制 ??? 文件名匹配类型 ??? 路径名模式匹配类型 ??????? 组文件 ? ...
最新文章
- Objective-C:在类中设置不同协议
- WF,WPF,Silverlight的DependencyProperty 附加属性
- linux内核I2C子系统学习(三)
- Android Studio打包APK时出现 is not translated in en (English) [MissingTranslation]
- npm install 报错 :stack Error: Can't find Python executable python
- VScode 知识点查阅
- Python菜鸟入门:day14编程学习
- Android Jni开发,报com.android.ide.common.process.ProcessException: Error configuring 错误解决方案...
- python序列类型唯一的映射类型_什么是python中唯一的映射类型
- Silverlight5.0正式发布附下载地址
- C/C++语言函数之strlen函数用法
- SpringCloud微服务之学生管理
- hdu 4475 Downward paths (找规律)
- 【安全】Java(web)项目安全漏洞及解决方式【面试+工作】
- 微信小程序中图片下面出现空白区
- sketch切换画板_Sketch App:如何与团队共享画板
- vue手机号中间四位加*号
- 发射,接收天线方向图
- 软件设计师 资料 下载
- 【C语言】青蛙跳台阶问题
热门文章
- pandas 处理 csv
- Android 记忆卡片游戏 记忆力 Android游戏 Android记忆卡片游戏源代码
- python html做界面_[Python]简单的HTML页面合并脚本
- 如何在 Ubuntu Linux 中打开终端(小白教程)
- 图像采样、量化、编码(二十七)
- Android Framebuffer设置分辨率
- github README.md使用
- Vue之路由beforeEach
- Rtsp之海康设备预览回放url
- 解决 elementUI 切换table后 el_table 固定列下方多了一条线