#include <stdio.h> // 标准输入输出库
#include <string.h> // 字符串操作库
#include <stdlib.h> // 常用函数库
#include <strings.h> // 字符串操作库(不推荐使用,建议使用<string.h>)
#include <sys/types.h> // 系统数据类型定义
#include <sys/stat.h> // 文件状态信息库
#include <fcntl.h> // 文件控制库
#include <unistd.h> // POSIX 操作系统 API
int main(int argc, char *argv[]) { // 主函数,接收命令行参数
// 检查命令行参数是否正确,如果不正确则打印程序名称并返回错误码
if(argc != 3) {
printf("%s\n", argv[0]); // 打印程序名称
return -1; // 返回错误码 -1
}
// 打开源文件,以只读方式打开
int src_fd = open(argv[1], O_RDONLY);
// 检查源文件是否成功打开,如果打开失败则打印错误信息并返回错误码
if(src_fd < 0) {
perror("open srcfile"); // 打印错误信息
return -1; // 返回错误码 -1
}
// 打开目标文件,如果不存在则创建,如果存在则清空其内容,以写入方式打开
int dest_fd = open(argv[2], O_TRUNC | O_CREAT | O_WRONLY, 0666);
// 检查目标文件是否成功打开,如果打开失败则打印错误信息并返回错误码
if(dest_fd < 0) {
perror("open src_dest"); // 打印错误信息
return -1; // 返回错误码 -1
}
char buf[32] = {0}; // 定义一个长度为 32 的字符缓冲区
// 循环读取源文件的内容并写入目标文件
while(1) {
int ret = read(src_fd, buf, sizeof(buf)); // 从源文件中读取内容到缓冲区中
// 检查读取操作是否出错,如果出错则打印错误信息并返回错误码
if(ret < 0) {
perror("read"); // 打印错误信息
return -1; // 返回错误码 -1
}
// 如果读取到文件末尾,则跳出循环
else if(ret == 0) {
break; // 跳出循环
}
// 将从源文件中读取的内容写入目标文件
write(dest_fd, buf, ret); // 将缓冲区中的内容写入目标文件
}
// 关闭源文件和目标文件
close(src_fd); // 关闭源文件
close(dest_fd); // 关闭目标文件
return 0; // 返回正常结束码 0
}
-
编译程序:
打开终端,并进入到包含你的源文件test1.c
的目录中。然后使用gcc
命令来编译你的程序:gcc test1.c -o copyfile
这会生成一个名为
copyfile
的可执行文件。 -
运行程序:
确保你的源文件text.txt
存在于同一个目录中。然后在终端中运行编译后的可执行文件,并指定源文件和目标文件的名称:./copyfile text.txt destination.txt
这样做将会将
text.txt
文件的内容复制到destination.txt
文件中。
如果你没有使用 -o
选项来命名输出,你可以使用默认生成的可执行文件名 a.out
,运行方式如下:
./a.out text.txt destination.txt
确保 text.txt
存在于你的工作目录中,否则你需要提供正确的路径。同时,destination.txt
将会被创建或覆盖,所以确保你有权限进行写入操作。