一、文件I/O操作
1、打开文件
函数open()
需要头文件:#include<sys/stat.h> #include<fcntl.h>
函数原型:int open(const char *pathname,int flags,int perms);
函数参数:pathname:打开文件名(可以包含具体路径名)
flags:打开文件的方式,具体见下
perms:新建文件的权限,可以使用宏定义或者八进制文件权限码,具体见下
函数返回值:成功:文件描述符
失败:-1
参数2 flags具体可用参数(若使用多个flags参数可以使用|组合):
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以可读可写方式打开文件
O_CREAT:如果文件不存在,就创建这个文件,并使用参数3为其设置权限
O_EXCL:如果使用O_CREAT创建文件时文件已存在则返回错误信息。使用这个参数可以测试文件是否已存在
O_NOCTTY:若打开的是一个终端文件,则该终端不会成为当前进程的控制终端
O_TRUNC:若文件存在,则删除文件中全部原有数据并设置文件大小为0
O_APPEND:以添加形式打开文件,在对文件进行写数据操作时数据添加到文件末尾
注意:O_RDONLY与O_WRONLY与O_RDWR三个参数互斥,不可同时使用
若在参数2的位置有多个参数进行组合,注意使用按位或(|)运算符。
2、文件读写
函数read()
需要头文件:#include<unistd.h>
函数原型:int read(int fd,void *buf,size_t count);
函数参数:fd:文件描述符
buf:读取出的数据存放的缓冲区
count:指定读取的字节数
函数返回值:成功:读到的字节数 或 0(表示文件已结尾)
失败:-1
函数write()
需要头文件:#include<unistd.h>
函数原型:ssize_t write(int fd,void *buf,size_t count);
函数参数:fd:文件描述符
buf:待写入的数据存放的缓冲区
count:指定写入的字节数
函数返回值:成功:已写的字节数
失败:-1
二、标准I/O操作
1、打开文件(流)
使用fopen()/fdopen()/freopen()函数可以打开一个文件。其中fopen()是最常用的函数,fdopen()可以指定打开文件的文件描述符和模式,freopen()除可以指定打开的文件与模式外,还可以指定特定的I/O流。
函数fopen()
需要头文件:#include<stdio.h>
函数原型:FILE *fopen(const char *path,const char *mode)
函数参数:path:要打开的文件的路径及文件名
mode:文件打开方式,见下
函数返回值:成功:指向文件的FILE类型指针
失败:NULL
以下是mode参数允许使用的取值及说明:
r或rb 以只读的方式打开文件,该文件必须存在
r+或r+b 以可读可写的方式打开文件,该文件必须存在
w或wb 以只写的方式打开文件,若文件不存在则创建该文件;若文件存在则擦除文件原始内容,从文件开头开始操作文件
w+或w+b 以可读可写的方式打开文件,若文件不存在则创建该文件;若文件存在则擦除文件原始内容,从文件开头开始操作文件
a或ab 以附加的方式打开只写文件,若文件不存在则创建该文件;若文件存在,写入的数据追加在文件尾,即文件的原始内容会被保留
a+或a+b 以附加的方式打开可读可写文件,若文件不存在则创建该文件;若文件存在,写入的数据追加在文件尾,即文件的原始内容会被保留
注意:
⒈+的作用代表操作文件的方式是只读/写/附加(无+)还是同时读写(有+)
⒉b的作用代表操作的文件是ASCII文本文件(无b)还是二进制文件(有b)
2、关闭文件(流)
使用fclose()函数可以关闭一个文件,该函数将缓冲区内的所有内容写入相关文件中并回收相应的系统资源
函数fclose()
需要头文件:#include<stdio.h>
函数原型:int fclose(FILE *stream)
函数参数:stream:已打开的流指针
函数返回值:成功:0
失败:EOF
3、指定大小读/写文件
格式化输入/输出函数fscanf()/fprintf()使用比较方便,程序也简单易懂,但是fscanf()/fprintf()的读/写效率低下。一般在程序开发过程中,更多的使用fread()/fwrite()函数来一次读/写几个数据。
函数fread()
需要头文件:#include<stdio.h>
函数原型:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
函数参数:ptr:存放读入数据的缓冲区
size:读取的每个数据项的大小(单位字节)
nmemb:读取的数据个数
stream:要读取的流
函数返回值:成功:实际读到的nmemb数目
失败:0
函数fwrite()
需要头文件:#include<stdio.h>
函数原型:size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream);
函数参数:ptr:存放写入数据的缓冲区
size:写入的每个数据项的大小(单位字节)
nmemb:写入的数据个数
stream:要写入的流
函数返回值:成功:实际写入的nmemb数目
失败:0