感受下C语言在Linux中读写文件用法,纯粹兴趣学习记录。
既然要读写文件,那肯定要使用Linux系统调用了,就是利用Linux系统提供的API进行函数调用,最终来实现文件读写。
操作文件通用步骤:
打开文件获取文件描述符
读写文件
关闭文件
上面有提到文件描述符,那什么是文件描述符?
当Linux系统打开一个文件的时候,会向程序返回一个非负整数,这个整数标识Linux系统打开的文件记录,通过这个整数就可以操作文件了。要是系统返回-1就表示打开失败了。
- 打开文件获取文件描述符
int open(const char *pathname, int flags);
第一个参数代表文件名。
第二个表示文件访问模式有:
O_READ(只读)
O_WRONLY,(只写)
O_RDWR(读写)
返回参数就是文件描述符(file description)了
- 读写文件
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
size_t是unsigned int 表示只能大于等于0
ssize_t是signed int 可以为正,可以为负
- 关闭文件
int close(int fd);
说了半天没啥干货,直接上代码就明白了
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
void readFile() {
char s[] = "main.c";
//只读打开文件
int fd = open(s, O_RDONLY);
if(fd == -1) {
printf("error is %s\n", strerror(errno));
return;
}
printf("sucess fd = %d\n", fd);
char buf[100];
memset(buf, 0, sizeof(buf));
//read返回0表示文件读取完毕
while(read(fd, buf, sizeof(buf) - 1) > 0) {
printf("%s\n", buf);
memset(buf, 0, sizeof(buf));
}
printf("%s\n", buf);
//别忘记关闭
close(fd);
}
void writeFile() {
char s[] = "abc.txt";
//读写并追加方式
int fd = open(s, O_RDWR | O_APPEND);
if(fd == -1) {
//发生错误会把错误信息设置到errno中
//通过strerror函数获取错误内容
printf("error is %s\n", strerror(errno));
return;
}
printf("sucess fd = %d\n", fd);
char buf[100];
memset(buf, 0, sizeof(buf));
int i = 10;
while(i-- > 0){
strcpy(buf, "hello world linux write file \n");
write(fd, buf, strlen(buf));
memset(buf, 0, sizeof(buf));
}
close(fd);
}
int main(int arg, char *args[]) {
readFile();
writeFile();
return 0;
}
要是不明白直接在linux系统中看man命令提供的帮助文档
man 2 read
man 2 write
Tip:
man 后面的2表示手册类型,因为read、write是Linux提供的系统调用(内核提供的函数),为了保证要查看的帮助是系统调用,所以指定手册类型为2。不加2的话有可能会查到可执行程序(shell命令)的用法。
还有一个常用的手册类型是3表示库函数调用(C程序库中的函数)