【Linux之IO系统编程学习】
项目代码获取:
https://gitee.com/chenshao777/linux_-io.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)
02.write函数和read函数
目录
一、write函数(man手册)
二、read函数(man手册)
三、写入+读取实验
四、lseek函数
五、写入+读取实验(加入读写指针移动)
一、write函数(man手册)
man 2 write
得到 man 手册内容
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
其他内容省略......
可以看到需要包含 unistd.h 头文件,且write函数有
三个参数
,以及一个返回值
项目 | 含义 |
---|---|
fd | 操作的文件描述符 |
buf | 写入的数组 |
count | 写入的字节数 |
返回值 | 写入成功的字节数 |
二、read函数(man手册)
man 2 read
得到 man 手册内容
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
其他内容省略......
可以看到需要包含 unistd.h 头文件,且read函数有
三个参数
,以及一个返回值
参数 | 含义 |
---|---|
fd | 操作的文件描述符 |
buf | 读取的数据存放到该数组 |
count | 要读取的字节数 |
返回值 | 实际读取到的字节数 |
三、写入+读取实验
使用
write函数
向文件a.txt中写入数据,使用
read函数
读取出数据并打印显示
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int fd;
int wr_res, re_res;
char wr_buf[100];
char re_buf[100];
/*通过main参数接收要写入的内容*/
sprintf(wr_buf, "%s", argv[2]);
/*以清空全部内容和读写方式打开文件*/
fd = open(argv[1], O_TRUNC | O_RDWR);
if(fd < 0){
printf("open file failed , fd = %d\n",fd);
return 0;
}else{
printf("open file success , fd = %d\n",fd);
}
/*向文件中写入数据*/
wr_res = write(fd, wr_buf, strlen(wr_buf));
/*write函数的返回值是写入成功的字节数*/
printf("write success bytes = %d\n",wr_res)
/*读取文件内容*/
re_res = read(fd, re_buf, sizeof(re_buf));
/*read函数的返回值是读取成功的字节数*/
printf("read success byte = %d\n",re_res);
printf("read data = %s\n", re_buf);
close(fd);
return 0;
}
步骤:
1.通过main参数接收要写入的内容
2.以清空全部内容和读写方式打开文件
3.使用write函数向文件中写入数据
4.使用read函数读取文件内容,并打印读取成功的字节数与读取的内容
实验结果:
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./a.out a.txt nihao
open file success , fd = 3
write success bytes = 5
read success byte = 0
read data =
发现读取成功的字节数是0,这就要引入一个概念,就是
文件读写指针
,由于我们是先写入内容,所以文件读写指针在
文件的最后位置
,所以read的时候默认从最后开始读取,所以读
不到数据
四、lseek函数
使用
lseek函数
可以操作文件读写指针的位置
使用man手册查看
man 2 lseek
省略其他内容......
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
DESCRIPTION
lseek() repositions the file offset of the open file description associated with the file descriptor
fd to the argument offset according to the directive whence as follows:
SEEK_SET
The file offset is set to offset bytes.
SEEK_CUR
The file offset is set to its current location plus offset bytes.
SEEK_END
The file offset is set to the size of the file plus offset bytes.
省略其他内容......
off_t lseek(int fd, off_t offset, int whence);
参数 | 含义 |
---|---|
fd | 操作的文件描述符 |
offset | 偏移量(相对于whence参数) |
whence | 当前位置基点 |
返回值 | 文件读写指针当前位置(失败返回-1) |
whence参数有三个选项
SEEK_SET : 文件开头位置
SEEK_CUR: 当前读写指针位置
SEEK_END: 文件结尾位置
所以在读取文件之前,先将读写指针调到文件开头位置即可读取成功
即加入下面这一句
lseek(fd, 0, SEEK_SET);
五、写入+读取实验(加入读写指针移动)
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char *argv[])
{
int fd;
int wr_res, re_res;
char wr_buf[100];
char re_buf[100];
/*通过main参数接收要写入的内容*/
sprintf(wr_buf, "%s", argv[2]);
/*以清空全部内容和读写方式打开文件*/
fd = open(argv[1], O_TRUNC | O_RDWR);
if(fd < 0){
printf("open file failed , fd = %d\n",fd);
return 0;
}else{
printf("open file success , fd = %d\n",fd);
}
/*向文件中写入数据*/
wr_res = write(fd, wr_buf, strlen(wr_buf));
/*write函数的返回值是写入成功的字节数*/
printf("write success bytes = %d\n",wr_res);
/*调整文件定位指针位置, 相对文件开头位置偏移0个位置*/
lseek(fd, 0, SEEK_SET);
/*读取文件内容*/
re_res = read(fd, re_buf, sizeof(re_buf));
/*read函数的返回值是读取成功的字节数*/
printf("read success byte = %d\n",re_res);
printf("read data = %s\n", re_buf);
close(fd);
return 0;
}
运行结果:
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./a.out a.txt nihao
open file success , fd = 3
write success bytes = 5
read success byte = 5
read data = nihao
读写成功!