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文件操作相关推荐

  1. linux的头文件下载,Linux内核头文件(linux headers)

    更新 Linux 内核头文件(linux headers) 三 8th, 2013 2,474 views | 发表评论 | Trackback 一般来说,如果不是自己编译 kernel,那么更新头文 ...

  2. linux c open fopen freopen 文件操作函数

    open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的系 ...

  3. linux gcc编译下的文件读写操作

    linux下的文件操作 所有目录             1.文件及文件系统的定义             2.linux文件的类型             3.linux文件的权限          ...

  4. linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件

    网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...

  5. 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 ...

  6. linux c之c语言符合标准的头文件和linux常用头文件

    1.C语言符合标准的头文件 #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h ...

  7. grep递归查找头文件_Grep命令教程–如何使用递归查找在Linux和Unix中搜索文件

    grep递归查找头文件 grep stands for Globally Search For Regular Expression and Print out. It is a command li ...

  8. linux语言的说明顺序有哪些,(linux常用头文件详解.doc

    (linux常用头文件详解 linux常用头文件详解 POSIX标准定义的头文件??????? 目录项 ???????? 文件控制 ??? 文件名匹配类型 ??? 路径名模式匹配类型 ??????? ...

  9. linux 常用头文件,(常用头文件详解.doc

    (常用头文件详解 linux常用头文件详解 POSIX标准定义的头文件??????? 目录项 ???????? 文件控制 ??? 文件名匹配类型 ??? 路径名模式匹配类型 ??????? 组文件 ? ...

最新文章

  1. Objective-C:在类中设置不同协议
  2. WF,WPF,Silverlight的DependencyProperty 附加属性
  3. linux内核I2C子系统学习(三)
  4. Android Studio打包APK时出现 is not translated in en (English) [MissingTranslation]
  5. npm install 报错 :stack Error: Can't find Python executable python
  6. VScode 知识点查阅
  7. Python菜鸟入门:day14编程学习
  8. Android Jni开发,报com.android.ide.common.process.ProcessException: Error configuring 错误解决方案...
  9. python序列类型唯一的映射类型_什么是python中唯一的映射类型
  10. Silverlight5.0正式发布附下载地址
  11. C/C++语言函数之strlen函数用法
  12. SpringCloud微服务之学生管理
  13. hdu 4475 Downward paths (找规律)
  14. 【安全】Java(web)项目安全漏洞及解决方式【面试+工作】
  15. 微信小程序中图片下面出现空白区
  16. sketch切换画板_Sketch App:如何与团队共享画板
  17. vue手机号中间四位加*号
  18. 发射,接收天线方向图
  19. 软件设计师 资料 下载
  20. 【C语言】青蛙跳台阶问题

热门文章

  1. pandas 处理 csv
  2. Android 记忆卡片游戏 记忆力 Android游戏 Android记忆卡片游戏源代码
  3. python html做界面_[Python]简单的HTML页面合并脚本
  4. 如何在 Ubuntu Linux 中打开终端(小白教程)
  5. 图像采样、量化、编码(二十七)
  6. Android Framebuffer设置分辨率
  7. github README.md使用
  8. Vue之路由beforeEach
  9. Rtsp之海康设备预览回放url
  10. 解决 elementUI 切换table后 el_table 固定列下方多了一条线