利用标准文件IO编程实现普通文件的拷贝操作,拷贝是利用main函数参数传入指定文件名,如果传入的文件名不是普通文件,报错并退出程序。
时间: 2023-12-03 20:46:23 浏览: 88
下面是一个利用标准文件IO编程实现普通文件拷贝的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
if (argc < 3) {
fprintf(stderr, "Usage: %s <source_file> <destination_file>\n", argv[0]);
exit(EXIT_FAILURE);
}
// 打开源文件
int src_fd = open(argv[1], O_RDONLY);
if (src_fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 检查源文件是否是普通文件
struct stat src_stat;
if (fstat(src_fd, &src_stat) == -1) {
perror("fstat");
exit(EXIT_FAILURE);
}
if (!S_ISREG(src_stat.st_mode)) {
fprintf(stderr, "%s is not a regular file\n", argv[1]);
exit(EXIT_FAILURE);
}
// 创建目标文件
int dst_fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (dst_fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 拷贝数据
char buffer[4096];
ssize_t nread;
while ((nread = read(src_fd, buffer, sizeof(buffer))) > 0) {
ssize_t nwritten = write(dst_fd, buffer, nread);
if (nwritten == -1) {
perror("write");
exit(EXIT_FAILURE);
}
}
if (nread == -1) {
perror("read");
exit(EXIT_FAILURE);
}
// 关闭文件
if (close(src_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
if (close(dst_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
return 0;
}
```
代码中首先检查了命令行参数个数,如果不足两个则输出用法信息并退出程序。然后通过 `open` 函数打开源文件,并利用 `fstat` 函数检查源文件是否是普通文件。如果不是普通文件则输出错误信息并退出程序。接着通过 `open` 函数创建目标文件,并利用 `read` 和 `write` 函数进行数据拷贝。最后关闭文件并返回。
需要注意的是,代码中使用了系统调用函数,因此需要在编译时链接相应的库,例如:
```
gcc -o copy_file copy_file.c
```
阅读全文