C库中的文件读写函数
头文件:stdio.h
fopen
功能:打开文件
声明:
FILE *fopen(const char *filename, const char *mode)
参数
- filename:要打开的文件名(包括路径)
- mode:文件访问模式
模式 | 描述 | 文件不存在时 |
---|---|---|
“r”(只读) | 打开一个已存在的文件 | 出错 |
“w”(只写) | 打开一个用于写入的空文件,若文件存在,则会删除已有文件内容,文件被视为一个新的空文件 | 创建文件 |
“a”(追加) | 追加到一个文件。写文件向文本尾添加数据 | 创建文件 |
“r+”(读写) | 打开一个用于更新的文件 | 出错 |
“w+”(读写) | 打开一个读写空文件,若文件存在,则文件长度清零 | 创建文件 |
“a+”(读写) | 用于读取和追加文件 | 新建文件 |
其他文件模式
1. 文件使用模式由:r,w,a,t,b,+六个字符拼成,个字符的含义是:
r(read):读
w(write):写
a(append):追加
t(text):文本文件,可省略不写
b(banary):二进制文件
+:读和写
例如rb+表示打开一个二进制文件,允许读写
返回值
成功:返回一个FILE类型的指针
失败:NULL,且设置全局变量errno来标识错误
fclose
功能
关闭流stream,刷新所有缓冲区。
声明
int fclose(FILE *stream)
参数
- stream:指向FILE对象的指针,该对象指定了要被关闭的文件
返回值
成功:0
失败:EOF
fread
功能
读取数据到ptr所指向的数组中
声明
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
- ptr:指向带有最小尺寸 size*nmemb 字节的内存块指针
- size:要读取的每个元素的大小,以字节为单位
- nmemb:要读取的元素个数,每个元素的大小为size字节
- stream:指向要读取的文件的FILE对象
返回值
读取到的元素个数,如果与nmemb的个数不同,则可能发生一个错误或者是读到了文件的末尾。
fwrite
功能
将ptr所指向的数据写入到文件中
声明
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数
- ptr:指向要被写入的元素数组的指针
- size:要写入的每个元素的大小,以字节为单位
- nemeb:写入的元素个数,每个元素大小为size字节
- stream:指向写入的文件的FILE指针
返回值
真是写入文件的元素个数
fgets
功能
从指定文件读取一行,并把它存储在str所指向的字符串内,当读取到(n-1)个字符,或者读取到换行符,或者文件末尾的时候停止。
声明
char *fgets(char *str, int n, FILE *stream)
参数
- str:指向一个字符数组的指针 ,用来存放读取到的数据
- n:要读取的最大字符数,包含最后的空字符,通常为str传递的数组长度
- stream:要读取的文件的FILE对象指针
返回值
成功:返回读取到的字符。如果读到文件的末尾或者没有读到任何字符,str内容保持不变,并返回 空指针
失败:返回 空指针
fputs()
功能
把字符串写入到指定则文件中,但是不包括空字符
声明
int fputs(const char *str, FILE *stream)
参数
- str:要写入的字符串
- stream:要写入的文件的FILE对象指针
返回值
成功:非负值
失败:EOF
注意:fgets和fputs是字符串读写,fread和fwrite是数据块读写
系统中的读写文件函数
open
功能:打开文件
声明
int open(const char *pathname, int flags)
int open(const char *pathname, int flags, mode_t mode)
参数
-
pathname:文件路径,若有多级目录则先建目录
-
flags:以下选项三选一
- O_RDONLY:只读模式
- O_WRONLY:只写模式
- O_RDWR:读写模式
可选:
O_APPEND:每次写操作都写入文件末尾
O_CREAT:如果指定文件不存在,创建文件
O_EXCL:如果要创建的文件已存在,返回-1,并修改errno的值
O_TRUNC:如果文件存在,并且以只写/读写的方式打开,则清空文件全部内容(将其长度截断为0)
O_NOCTTY:如果路径指向终端设备,不要把这个舍内用作控制终端
O_NONBLOCK:如果路径指向FIFO/块文件/字符文件,则把文件的打开和后继I/O -
mode:生成文件的权限
返回值
成功:文件描述符,一个非负整数
失败:-1
close
功能:关闭文件
声明
int close(int fd)
参数
- fd:要关闭的文件对应的文件描述符
返回值
成功:0
失败:-1
除了使用close函数显式关闭文件外,在linux系统中,当一个进程终止时,内核会自动关闭他打开的所有文件。
read
功能:读文件
声明
ssize_t read(int fd, void *buf, size_t count)
参数
- fd:要读取的文件的文件描述符
- buf:用于存放读取到的数据
- count:需要读取的字节数
返回值
成功:读取到的字节数
write
功能:写文件
声明
ssize_t write(int fd, const void *buf, size_t count)
参数
- fd:要写入的文件的文件描述符
- buf:指定写入数据对应的缓冲区
- count:指定写入的字节数
返回值
成功:写入的字节数,0表示未写入任何字节,如果返回的数字小于count,并不是错误,有可能是磁盘空间已满
失败:-1
fopen和open的区别
- fopen是标准库函数,open是POSIX定义的,UNIX的系统函数
- 使用fopen系列函数时要定义指代文件的对象,一个FILE结构体,open函数的返回值是int类型的文件描述符
- fopen是带有缓冲区的,open是不带缓冲区,直接写入磁盘的
- open在新建文件时可以指定文件的权限