Linux C的文件操作及相关函数

一、Linux文件的属性及文件的分类

二、文件描述符的概念及作用

三、系统调用的概念

三、不带缓存的文件I/O操作的相关函数

四、带缓存的文件I/O操作的相关函数





一、Linux文件的属性

文件的属性:

我们在Gcc编译器输入“ ls  -al"指令时,除了有不同的类型外还有一些字母串如”drwx-wx-wx",除第一个字符外(表示文件类型:例如普通文件),这里还剩三组,每组3个字符构成的字符串,这里的3个字符实质上就是文件的访问属性:

r:可读;w:可写;x:可执行

三组字符串的分类:

①第一个3位字符组表示文件拥有者对该文件的权限;

②第二个3位字符组表示同组的用户对该文件的权限;

③第三个3位字符组表示其他用户对该文件的权限;


二、文件描述符的概念及作用

什么是文件描述符:文件描述符是一个非负整数,当某个程序打开文件时,操作系统返回相应的文件描述符,程序处理该文件必须引用此描述符。

系统默认的描述符如下:



三、系统调用的概念

所谓系统调用,是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组接口来获得操作系统内核提供的服务,例如用户可以用来创建进程等。

系统调用关系图:

从上图可以看出系统将程序的运行空间分为了内核空间和用户空间,通过API接口实现系统调用,目的是保护系统的内核。


四、不带缓存的文件I/O操作的相关函数

(1)creat函数

函数的作用:创建一个新文件

函数的原型:int  creat(const  char  *filename,mode_t  mode);

头文件:#include <sys/types.h>

                #include <sys/stat.h>

                #include <fcntl.h>

返回值:执行成功,返回新的文件描述符;执行出错,返回-1。

函数参数:

fliename:文件名或文件路径

mode:创建文件的模式:①S_IRUSR  可读

                                              ②S_IWUSR  可写

                                              ③S_IXUSR   可执行


(2)open函数

函数的作用:打开一个文件

函数的原型:①int  open(const  char  *pathname,int  flags);(所打开文件存在下使用)

                        ②int  open(const  char  *pathname,int  flags,mode_t  mode);(所打开文件不存在时创建并打开)

头文件:

                #include <sys/types.h>

                #include <sys/stat.h>

                #include <fcntl.h>

返回值:执行成功,返回新分配的文件描述符;执行出错,返回-1。

参数:

对于参数flags有以下几种:

① O_CREAT:若文件不存在,该参数可以创建该文件

② O_RDONLY:以只读方式打开文件

③ O_WRONLY:以只写方式打开文件

④ O_RDWR:以可读写方式打开文件

⑤ O_APPEND:以附加方式加到文件后面(保存原来有的内容)


(4)read函数

函数的作用:从打开的文件中读取数据

函数的原型:ssize_t  read(int  fd,void  *buf,size_t  count);

头文件:#include <unistd.h>

返回值:执行正常时,返回实际读取到的字节数;若读取文件结束或者无数据读取时,返回0;执行出错,返回-1。

参数:

fd:文件描述符

buf:文件读取到的数据存放的地址

count:要读取数据的大小


(5)write函数

函数的作用:向打开的文件中写入数据

函数的原型:ssize_t  write(int  fd,const  void   *buf,size_t  count);

头文件:#include <unistd.h>

返回值:执行成功,返回实际写入文件中的字节数,写入字节数又分三种情况:全写入、部分写入及0个写入;

                执行出错,返回-1。

参数:

fd:函数描述符

buf:写入文件的数据所在的首地址,这里可以是字符串或者是数组名或指针

count:写入数据的大小


(6)lseek函数

函数的作用:对文件进行定位

函数的原型:int  lseek(int  fd,offset_t  offset,int  whence);

头文件:#include <sys/types.h>

                #include <unistd.h>

返回值:执行成功,返回文件当前指针到文件头之间的字节数;

                执行出错,返回-1。

参数:

fd:文件描述符

offset:表示指针的微调量的大小,对指针的位置进行微调,取正值时将指针从当前位置向后移动offset个单位,取负值则向前移动

whence:指针的位置

① SEEK_SET:将文件指针放在文件首

② SEEK_CUR:将文件指针放在当前位置

③ SEEK_END:将文件指针放在文件末尾


获取文件的大小可以将文件指针放在文件末尾即可。

四、带缓存的文件I/O操作的相关函数

1、不带缓存(系统调用)的I/O操作是对文件描述符操作,带缓存(标准I/O库函数)的I/O操作是针对流,带缓存的目的是尽可能地减少使用read()write()调用的次数。

2、相关函数

1fopen函数

函数的作用:打开文件

函数的原型:FILE  *fopen(const  char  *pathconst  char  *mode)

头文件:#include <stdio.h>

返回值:执行成功,返回指向该流的文件的指针;执行出错,返回NULL

参数:

path:欲打开的文件路径或文件名(字符串形式)

mode:流形态:

① r:打开只读文件,文件必须存在

② r+:打开可读写文件,文件必须存在

③ w:打开只写文件,文件若不存在则创建该文件,文件若存在则清空文件内容

④ w+:打开可读写文件,文件若不存在则创建该文件,文件若存在则清空文件内容

⑤ a:以附加方式打开只写文件,若文件不存在则创建该文件,文件若存在写入的数据从原来的文件尾加入

⑥ a+:以附加方式打开可读写文件,若文件不存在则创建该文件,文件若存在写入的数据从原来的文件尾加入

 

(2)fputc函数

函数的作用:将一个指定的字符写入到参数stream指定的文件中

函数的原型:int  fputc(int  c,FILE  *stream);

头文件:#include <stdio.h>

返回值:执行成功,返回写入的字符即参数c;执行出错,返回EOF

参数:

c:欲写入的字符

stream:文件流中已打开的文件指针


(3)fgetc函数

函数的作用:从stream指定的文件中读取一个字符

函数的原型:int  fgetc(FILE  *stream);

头文件:#include <stdio.h>

返回值:执行成功,返回读取到的字符;返回EOF表示到了文件的末尾

参数:

stream:文件流中已打开的文件指针


(4)fputs函数

函数的作用:将一个字符串写入到stream指定的文件中

函数的原型:int  fputs(const  char  *s,FILE  *stream);

头文件:#include <stdio.h>

返回值:执行成功,返回写入文件的字符个数;执行出错,返回EOF

参数:

s:写入的字符串

stream:文件流中已打开的文件指针


(5)fgets函数

函数的作用:从文件流中读取一个字符串到s所指的存储空间,直到出现换行符、读到文件尾或者已读了size-1个字符为止

函数的原型:char *  fgets(char  *s,int  size,FILE  *stream);

头文件:#include <stdio.h>

返回值:执行成功,返回s指针;执行出错,返回NULL

参数:

s:读取字符串的存储空间的首地址

size:  读取的字符串的字符个数(size - 1)

stream:文件流中已打开的文件指针


(6)fread函数

函数的作用:从stream所指的文件中读取数据块

函数的原型:size_t  fread(void  *ptr,size_t  size,size_t  nmemb,FILE  *stream);

头文件:#include <stdio.h>

返回值:返回实际读到的数据块的数目,若比nmemb小可能是读到了文件末尾或者错误发生;feof()函数用于判断是否到文件尾;ferror()函数用于判断是否发生错误

参数:

ptr:读取的数据存放的地址

size:每个数据块的大小

nmemb:读取数据块的个数

stream:文件流中已打开的文件指针


(7)fwrite函数

函数的作用:将数据块写到stream指向的文件中
函数的原型:size_t  fwrite(const  void  *ptr,size_t  size,size_t  nmemb,FILE *stream);
头文件:#include <stdio.h>
返回值:返回实际写入的数据块的数目,若比nmemb小可能是读到了文件末尾或者错误发生
参数:
ptr:欲写入文件的数据的地址
size:每个数据块的大小
nmemb:数据块的数目
stream:文件流中已打开的文件指针

(8)fseek函数
函数的作用:移动文件流的读写位置
函数的原型:int  fseek(FILE *stream,long  offset,int  whence);
头文件:#include <stdio.h>
返回值:执行成功,返回值为0;执行出错,返回-1。
参数:
stream:文件流中已打开的文件指针

offset:表示指针的微调量的大小,对指针的位置进行微调,取正值时将指针从当前位置向后移动offset个单位,取负值则向前移动

whence:指针的位置

① SEEK_SET:将文件指针放在文件首

② SEEK_CUR:将文件指针放在当前位置

③ SEEK_END:将文件指针放在文件末尾


(9)ftell函数

函数的作用:读取当前指针在文件流的的位置

函数的原型:long  ftell(FILE *stream);

头文件:#include <stdio.h>

返回值:执行成功,返回指针当前位置相对于文件首的偏移字节数;执行错误,返回-1。

参数:stream:文件流中已打开的文件指针


(10)feof函数

函数的作用:检测文件流是否到文件末尾

函数的原型:int  feof(FILE  *stream);

头文件:#include <stdio.h>

返回值:到文件末尾时返回非0值;其他情况返回0。

参数:stream:文件流中已打开的文件指针


(11)fprintf函数

函数的作用:格式化数据到文件,

函数的原型:int  fprintf(FILE  *stream,const  char  *format,......);

头文件:#include <stdio.h>

返回值:执行成功,返回实际输入的字符数;执行错误,返回-1。

参数:

stream:文件流中已打开的文件指针

format:字符串,为指定的格式


(12)fscanf函数

函数的作用:格式化字符串输入

函数的原型:int  fscanf(FILE  *stream,const  char  *format,......);

头文件:#include <stdio.h>

返回值:执行成功,返回参数的数目;执行出错,返回-1。










  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值