【Linux之IO系统编程学习】
项目代码获取:https://gitee.com/chenshao777/linux_-io.git
(麻烦点个免费的Star哦,您的Star就是我的写作动力!)
03.read函数+write函数实现cp命令效果
read与write函数的使用见我上一篇博客
https://blog.csdn.net/HuangChen666/article/details/130778392?spm=1001.2014.3001.5502
目录
一、实验分析
二、实验步骤
三、代码
四、实验结果
一、实验分析
cp函数的简单操作方法
如下操作所示,cp可以实现将a.txt的内容复制到另一个文件中,且如果该文件之前不存在,则会自动新建
如果该文件存在,则会清空该文件再复制全部内容到该文件
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ls
02.cp.c 02.write_read.c a.txt cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cp a.txt b.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ls
02.cp.c 02.write_read.c a.txt b.txt cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt
1234
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt
1234
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ echo "abcd" > a.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt
abcd
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cp a.txt b.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt
abcd
二、实验步骤
- 新建一个a.txt,并且写入一些数据
- 代码中,先以只读方式打开源文件,再以清空+只写方式打开目标文件(源文件和目标文件均通过main函数的参数argv得到)
- 如果目标文件不存在,则以只写权限新建目标文件,并赋予0777权限
- 循环读取源文件数据到读取缓冲区,按照读取到的字节数将读取缓冲区内的数据写入目标文件
- 当读取字节数小于传入读取字节参数时退出循环
- 退出后再写入一次数据到目标文件
- 关闭两个文件的文件描述符
三、代码
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
/*模拟cp命令,拷贝文件内容到另一个文件*/
int main(int argc, char *argv[])
{
/* 文件描述符 */
int wr_fd, re_fd;
/* 读取文件成功字节数 */
int re_count;
/* 读取缓冲区 */
char read_buff[128];
/* 判断输入参数个数是否正确 */
if(argc < 3){
printf("输入的参数不够\n");
return 0;
}
/* 以只读方式打开源文件 */
re_fd = open(argv[1], O_RDONLY);
if(re_fd > 0){
printf("源文件打开成功, re_fd = %d\n",re_fd);
}else{
printf("源文件打开失败, re_fd = %d\n",re_fd);
return 0;
}
/* 以只写方式打开目标文件,并且清空文件 */
wr_fd = open(argv[2], O_TRUNC | O_WRONLY);
if(wr_fd > 0){
printf("目标文件打开成功, wr_fd = %d\n",wr_fd);
}else{
printf("目标文件打开失败, wr_fd = %d\n",wr_fd);
/* 如果打开失败,则新建文件 */
wr_fd = open(argv[2], O_CREAT | O_WRONLY, 0777);
}
for(;;){
/* 循环读取文件 */
re_count = read(re_fd, read_buff, sizeof(read_buff));
/* 如果读取数据不够read_buff的大小,则退出 */
if(re_count < sizeof(read_buff)){
break;
}else{
/* 读写指针位置定位到文件最后 */
lseek(wr_fd, 0, SEEK_END);
/* 数据写入目标文件 */
write(wr_fd, read_buff, re_count);
/* 清空读取缓冲区 */
memset(read_buff, 0, sizeof(read_buff));
}
}
/* 读写指针位置定位到文件最后 */
lseek(wr_fd, 0, SEEK_END);
/* 数据写入目标文件 */
write(wr_fd, read_buff, re_count);
printf("文件拷贝成功!\n");
close(re_fd);
close(wr_fd);
return 0;
}
代码中注释比较清晰了已经,不做过多解释,主要是要注意每次写入源文件之前要将文件读写指针定位到文件最后
/* 读写指针位置定位到文件最后 */
lseek(wr_fd, 0, SEEK_END);
四、实验结果
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ gcc 02.cp.c -o cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt
1111
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ls
02.cp.c 02.write_read.c a.txt cp
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./cp a.txt b.txt
源文件打开成功, re_fd = 3
目标文件打开失败, wr_fd = -1
文件拷贝成功!
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt
1111
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ echo "abcdefg" > a.txt
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat a.txt
abcdefg
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ ./cp a.txt b.txt
源文件打开成功, re_fd = 3
目标文件打开成功, wr_fd = 4
文件拷贝成功!
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$ cat b.txt
abcdefg
hc@hc-vm:~/Linux_ARM/git/linux_-io/02.write和read函数$