C语言实现Linux命令行工具:VI和CAT
资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
前言
在Linux系统中,vi
和cat
是两个非常重要的命令行工具。vi
是一个文本编辑器,用于创建和编辑文件;cat
用于显示文件内容。本文将详细介绍如何用C语言实现这两个命令的简化版本,帮助大家理解文件操作、命令行参数处理和字符串处理的核心概念。
核心概念
1. 命令行参数处理
int main(int argc, char *argv[])
- •
argc
:命令行参数的数量 - •
argv
:命令行参数的字符串数组
2. 文件操作模式
- •
"w"
:写入模式,如果文件不存在则创建,存在则覆盖 - •
"r"
:读取模式,文件必须存在
3. 字符输入输出函数
- •
getchar()
:从标准输入读取一个字符 - •
fputc()
:向文件写入一个字符 - •
fgetc()
:从文件读取一个字符
项目实现
案例1:实现myVI命令
功能需求
- 1. 接收命令行参数作为文件名
- 2. 从键盘读取字符并写入文件
- 3. 当输入
:wq
时保存并退出
完整代码实现
// myVI.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char *argv[]) {FILE *fp;char ch;char buffer[100];int index = 0;// 检查命令行参数if (argc != 2) {printf("使用方法: %s <文件名>\n", argv[0]);return 1;}// 打开文件进行写入fp = fopen(argv[1], "w");if (fp == NULL) {printf("无法创建文件: %s\n", argv[1]);return 1;}printf("=== myVI 文本编辑器 ===\n");printf("开始编辑文件: %s\n", argv[1]);printf("输入 :wq 保存并退出\n");printf("------------------------\n");// 主编辑循环while (1) {ch = getchar();// 检查是否输入了退出命令if (ch == ':') {// 可能是退出命令的开始char next1 = getchar();if (next1 == 'w') {char next2 = getchar();if (next2 == 'q') {char next3 = getchar();if (next3 == '\n') {// 确认是 :wq 命令printf("保存文件并退出...\n");break;} else {// 不是完整的 :wq 命令,将字符写入文件fputc(':', fp);fputc('w', fp);fputc('q', fp);fputc(next3, fp);}} else {// 不是 :wq 命令fputc(':', fp);fputc('w', fp);fputc(next2, fp);}} else {// 不是 :w 开头fputc(':', fp);fputc(next1, fp);}} else {// 普通字符,写入文件fputc(ch, fp);}}fclose(fp);printf("文件已保存: %s\n", argv[1]);return 0;
}
编译和运行
# 编译
gcc -o myVI myVI.c# 运行
./myVI test.txt
运行结果:
=== myVI 文本编辑器 ===
开始编辑文件: test.txt
输入 :wq 保存并退出
------------------------
Hello World!
This is my first line.
This is my second