利用底层文件IO编程实现普通文本文件的拷贝操作,拷贝是利用main函数参数传入指定文件名,如果传入的文件名不是普通文件,报错并退出程序
时间: 2023-12-03 11:46:59 浏览: 79
下面是一个基于底层文件IO编程的普通文本文件拷贝操作的示例代码:
```c++
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s source_file target_file\n", argv[0]);
exit(EXIT_FAILURE);
}
const char *src_path = argv[1];
const char *dest_path = argv[2];
// 打开源文件
int src_fd = open(src_path, 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)) {
printf("%s is not a regular file\n", src_path);
exit(EXIT_FAILURE);
}
// 创建目标文件
int dest_fd = open(dest_path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (dest_fd == -1) {
perror("open");
exit(EXIT_FAILURE);
}
// 拷贝文件内容
char buffer[BUFFER_SIZE];
ssize_t read_size;
while ((read_size = read(src_fd, buffer, BUFFER_SIZE)) > 0) {
if (write(dest_fd, buffer, read_size) != read_size) {
perror("write");
exit(EXIT_FAILURE);
}
}
if (read_size == -1) {
perror("read");
exit(EXIT_FAILURE);
}
// 关闭文件
if (close(src_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
if (close(dest_fd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
return 0;
}
```
该程序的操作流程如下:
1. 通过 `argc` 和 `argv` 获取源文件名和目标文件名。
2. 使用 `open` 函数打开源文件,如果打开失败则报错并退出程序。
3. 使用 `fstat` 函数获取源文件的信息,判断是否为普通文件,如果不是则报错并退出程序。
4. 使用 `open` 函数创建目标文件,如果创建失败则报错并退出程序。
5. 使用循环读取源文件的内容,并将其写入目标文件中,如果写入失败则报错并退出程序。
6. 关闭源文件和目标文件,如果关闭失败则报错并退出程序。
7. 程序正常结束,返回 0。
该程序可以通过以下方式编译:
```
gcc -o copy_text_file copy_text_file.c
```
然后可以通过以下方式运行:
```
./copy_text_file source.txt target.txt
```
其中 `source.txt` 是源文件名,`target.txt` 是目标文件名。如果源文件不存在或者不是普通文件,程序会报错并退出。如果目标文件已经存在,则会被截断为0字节。
阅读全文