当前位置: 首页 > news >正文

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. 1. 接收命令行参数作为文件名
  2. 2. 从键盘读取字符并写入文件
  3. 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 
http://www.dtcms.com/a/274736.html

相关文章:

  • 飞算JavaAI进阶:重塑Java开发范式的AI革命
  • LGA核心板贴装指南:关键细节决定产品成败
  • MD2Doc转换器(基于Python)
  • Java 中的锁分类
  • 网页嵌入与接入功能说明
  • LeetCode经典题解:128、最长连续序列
  • Vue3 postcss-px-to-viewport-8-plugin
  • 力扣-21.合并两个有序链表
  • 【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南
  • (7)机器学习小白入门 YOLOv:机器学习模型训练详解
  • 「GRPO训练参数详解:理解Batch构成与生成数量的关系」
  • 如何使用数字化动态水印对教育视频进行加密?
  • 学习日记-spring-day46-7.11
  • 【Linux-云原生-笔记】系统引导修复(grub、bios、内核、系统初始化等)
  • USB数据丢包真相:为什么log打印会导致高频USB数据丢包?
  • 数据库系统的基础知识(三)
  • Logback.xml配置详解与实战指南
  • 目标检测中的NMS算法详解
  • Java基础-String常用的方法
  • 关于MySql索引,你需要知道!!!
  • CompletableFuture 详解
  • Java教程:JavaWeb ---MySQL高级
  • Flutter 箭头语法
  • 【世纪龙科技】新能源汽车结构原理教学软件-几何G6
  • OpenCV多种图像哈希算法的实现比较
  • 中国国际会议会展中心模块化解决方案的技术经济分析报告
  • C++中的智能指针(1):unique_ptr
  • 在Python项目中统一处理日志
  • javaweb之相关jar包和前端包下载。
  • AGX Xavier 搭建360环视教程【一、先确认方案】