在日常编程中,文件操作是一项基本技能。本篇博客将通过一段C语言代码示例,介绍如何编写一个简易的命令行界面程序,实现文件从一个位置到另一个位置的复制功能。
程序概览
我们的程序主要由三个部分组成:主菜单展示、文件拷贝功能实现以及主循环控制。下面分步骤解析代码逻辑及其背后原理。
1. 环境准备与宏定义
首先,我们禁用一些安全警告以兼容旧式文件操作函数,并引入必要的头文件:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 1024 * 2 //每次读写2k数据
_CRT_SECURE_NO_WARNINGS
是为了在Visual Studio等编译环境下避免因使用不推荐的安全函数而产生的警告。关于这个警告,可以看我的往期博客VS的警告。SIZE
定义了每次读写操作的数据块大小,这里设为2KB。
2. 主菜单展示函数 menu()
提供用户操作入口,展示可执行的命令选项:
void menu()
{
printf("================================\n");
printf("1 拷贝文件\n");
printf("2 清屏\n");
printf("3 退出\n");
printf("================================\n");
}
3. 文件拷贝功能 myCopy()
这是程序的核心功能,实现了从源文件到目标文件的数据复制。
- 输入源文件与目标文件路径:通过
scanf()
获取用户输入。 - 检查文件名是否相同:避免用户误操作覆盖原文件。
- 文件打开:分别以二进制读(
"rb"
)和写("wb"
)模式打开源文件和目标文件。 - 数据读写循环:使用
fread()
读取源文件数据到缓冲区,再用fwrite()
将缓冲区内容写入目标文件,直到文件末尾。 - 资源释放:操作完成后关闭两个文件指针。
void myCopy() {
char rPath[256]; //源文件
char wPath[256]; //目的文件
FILE *rFp = NULL;
FILE *wFp = NULL;
char buf[SIZE] = { 0 };
int n = 0;
printf("请输入源文件:");
scanf("%s", rPath);
printf("请输入目的文件:");
scanf("%s", wPath);
if (strcmp(rPath, wPath) == 0)
{
printf("源文件和目的文件不能相同\n");
return;
}
//只读方式打开源文件
rFp = fopen(rPath, "rb");
if (rFp == NULL)
{
perror("fopen rPath");
return;
}
//只写方式打开目的文件
wFp = fopen(wPath, "wb");
if (wFp == NULL)
{
fclose(rFp);
perror("fopen wFp");
return;
}
do
{
n = 0;
//读多少,写多少
n = fread(buf, sizeof(char), SIZE, rFp);
printf("拷贝:%d\n", n);
fwrite(buf, sizeof(char), n, wFp);
} while (n > 0);
printf("拷贝完成\n\n");
fclose(rFp);
fclose(wFp);
}
4. 主循环与程序控制
在main()
函数中,程序进入一个无限循环,根据用户的选择执行相应的操作:
- 显示菜单:调用
menu()
函数。 - 接收命令:通过
scanf()
读取用户输入的命令。 - 命令处理:
- 选择1时,调用
myCopy()
进行文件拷贝。 - 选择2时,使用
system("cls")
命令清屏(Windows环境)。 - 其他情况,默认为退出程序,使用
exit(0)
结束进程。
- 选择1时,调用
最后,通过system("pause")
保证程序在命令行窗口运行完毕后暂停,以便查看输出结果。
int main()
{
int cmd;
while (1)
{
menu();
printf("cmd: ");
scanf("%d", &cmd);
switch (cmd)
{
case 1:
myCopy();
break;
case 2:
system("cls");
break;
default:
exit(0);
}
}
printf("\n");
system("pause");
return 0;
}
小结
通过上述步骤,我们构建了一个基本但实用的文件拷贝工具,不仅加深了对C语言文件操作的理解,也学习了如何构建简单的用户交互程序。此程序虽然简单,但在理解文件I/O、错误处理及程序流程控制方面提供了很好的实践案例。希望这篇解析能帮助初学者更好地掌握C语言的文件操作技巧。