标准库IO接口:
- fopen
- fread/fwrite
- fseek
- fclose
FILE *fopen(const char *path, const char *mode);
path:文件路径名
mode:
- r 只读
- r+ 可读可写(覆盖式写入)
- w 只写,若文件不存在则创建,若文件有内容则清空再写入
- w+ 可读可写
- a 追加写打开,若文件不存在则创建,每次定位在文件末尾
- a+ 相较于a,多了可读操作
返回值:文件操作句柄—文件流指针
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr:要写入的数据
size:要写入块的大小(fwrite对数据进行按块操作)
nmemb:要写入的块个数
stream:fopen返回的文件流指针
返回值:实际写入的块个数
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:用于接收数据的缓冲区
size:要读取的块大小
nmemb:要读取的块个数
stream:fopen返回的文件流指针
返回值:实际读到的块个数 文件末尾:返回0
int fseek(FILE *stream, long offset, int whence);
对stream文件的读写位置跳转到whence位置偏移offset个字节处
whence:跳转的起始位置
- SEEK_SET 文件起始位置
- SEEK_CUR 当前读写位置
- SEEK_END 文件末尾位置
offse:偏移量
int fclose(FILE *stream);
那么我们来写个小程序来感受一下库函数IO接口
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main() {
FILE* fp=fopen("myfile","w");
if(fp==NULL) {
printf("fopen error\n");
}
char* message="have a nice day!\n";
fwrite(message,strlen(message),1,fp);
fclose(fp);
return 0;
}
首先用"w"方式打开一个myfile文件,我们看到开始我们是没有这个文件的,“w"方式为我们创建了一个myfile文件,并且在myfile文件中写入了"have a nice day!”
将"w"换成"a",并运行4次test程序,myfile文件中就成了5句话,说明"a"以是追加方式写,换成"r+"的话,则每次都是新写入的数据,"r+"是覆盖式写入
在使用完文件之后别忘了用fclose()关闭文件哦!!!
系统调用IO接口:
- open
- write
- read
- lseek
- close
int open(const char *pathname, int flags, mode_t mode)
功能:打开文件
pathname:指定打开的文件名称
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
必选参数:
- O_RDONLY: 只读打开
- O_WRONLY: 只写打开
- O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
可选参数:
- O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
- O_EXCL:与O_CREAT同时使用,若文件存在则报错,不存在则创建
- O_TRUNC:打开文件同时截断文件长度为0
- O_APPEND: 追加写
返回值:成功:新打开的文件描述符 错误;-1
ssize_t write(int fd, const void *buf, size_t count);
fd:open打开文件所返回的文件描述符
buf:要写入的数据
count:要写入的字节数
返回值:实际写入的字节数 失败:-1
off_t lseek(int fd, off_t offset, int whence);
whence:跳转的起始位置
SEEK_SET 文件起始位置
SEEK_CUR 当前读写位置
SEEK_END 文件末尾位置
offset:偏移量
ssize_t read(int fd, void *buf, size_t count);
从fd文件中读取count长度的数据放到buf中
返回值:返回实际读取到的字节数 失败:-1
int close(int fd);
用于关闭文件
1 #include<stdio.h>
2 #include<fcntl.h>
3 #include<errno.h>
4 #include<unistd.h>
5 #include<sys/stat.h>
6 #include<string.h>
7
8
9 int main() {
10 //将当前文件权限掩码值修改为000,默认为002
11 umask(0);
12 int fd=open("./test1.txt",O_RDWR|O_CREAT|O_APPEND|O_TRUNC,0664);
13 if(fd<0){
14 perror("open error");
15 return -1;
16 }
17 char* message="today is a good day!\n";
18 ssize_t ret=write(fd,message,strlen(message));
19 if(ret<0) {
20 perror("write error");
21 return -1;
22 }
23 lseek(fd,0,SEEK_SET);
24
25 char buf[1024]={0};
26 ret=read(fd,buf,1023);
27 if(ret<0) {
28 perror("read error");
29 return -1;
30 }
31 printf("ret:%d-%s\n",ret,buf);
32 close(fd);
33 return 0;
34 }
运行结果: