如何编写Linux下的cat命令?

    熟悉linux的童鞋应该都知道cat命令,今天本文就带大家来自己实现linux下的这个命令^_^

    预备知识:C语言文件处理的一些知识。

    关于文件访问,问题在于,如何设计命名文件的读取过程呢?换句话说,如何将用户需要使用的文件的外部名称同读取数据的语句关联起来。

    方法其实很简单。在读写一个文件之前,必须通过库函数fopen打开该文件。fopen用类似于x.c或x.txt这样的外部名与操作系统进行某些必要的连接和通信(我们不必关心这些细节),并返回一个随后可以用于文件读写操作的指针。

    该指针称为文件指针,它指向一个包含文件信息的结构(体),这些信息包括:缓冲区的位置、缓冲区中当前字符的位置、文件的读或写状态、是否出错或是否已经到达文件结尾等等。用户不必关心这些细节,因为在<stdio.h>中已经定义了一个包含这些信息的结构FILE。在程序中只需要按照下列方式声明一个文件指针即可:

    

FILE  *fp;
FILE  *fopen(char  *name,  char  *mode);
在本例中,fp是一个指向结构FILE的指针,并且fopen函数返回一个指向结构FILE的指针。

在程序中,可以这样调用fopen函数:

      

fp = fopen(name, mode);
第一个参数是文件名,第二个参数是访问模式。允许的访问模式有:读("r")、写("w")及追加("a")。

       关于文件大致就简单这样介绍下,更多详细内容请参考相关书籍^_^。

下面的程序主要实现cat命令的查看文件内容的功能:

       

#include <stdio.h>

void filecopy(FILE *, FILE *);

int main(int argc, char * argv[])
{
    FILE *ifp;
	FILE *ofp;
	if(argc == 1)
	   filecopy(stdin, stdout);
	/*else if(argc == 3)
	{
	    if(((ifp = fopen(argv[1], "r")) != NULL) && ((ofp = fopen(argv[2], "a")) != NULL))
		{
		    filecopy(ifp, ofp);
			fclose(ifp);
			fclose(ofp);
		} else
		{
		     printf("ERROR: can't open file");
			 exit(1);
		}
	} */else
	{
	     while(--argc > 0)
		      if((ifp = fopen(*++argv, "r")) == NULL)
			  {
			      printf("cat: can,t open %s\n", *argv);
				  exit(1);
			  } else
			  {
			     filecopy(ifp, stdout);
				 fclose(ifp);
			  }
	}
 
    return 0;
}

void filecopy(FILE * ifp, FILE * ofp)
{
     int c;
	 while((c = getc(ifp)) != EOF)
	       putc(c, ofp);
}

程序运行结果示例:


另外如果命令输入是“cat 文件名1  文件名2”时,希望程序的功能是将文件1中内容追加到文件2中的话,将上面程序注释部分取消就可以实现该功能,其他查看功能不变。

更多cat命令信息参看:linux下cat命令详解

经我测试,上面的程序能实现

cat命令的三大功能:
1.一次显示整个文件。$ cat filename
2.从键盘创建一个文件。$ cat > filename  (将标准输入的内容写到filename中)
3.将几个文件合并为一个文件: $cat file1 file2 > file

测试图片:


掌握Linux命令是一个循序渐进的过程,可以通过以下步骤快速入门和提升: 1. 理解命令行的基础:首先了解什么是shell,它是如何工作的。Shell是用户与Linux系统交互的界面,常见的shell包括bash、zsh等。 2. 学习基础命令:从最常用的命令开始,例如: - `cd`:改变当前目录 - `pwd`:显示当前工作目录的路径 - `cp`:复制文件或目录 - `mv`:移动或重命名文件或目录 - `rm`:删除文件或目录 - `mkdir`:创建目录 - `rmdir`:删除目录 - `touch`:创建空文件或修改文件时间戳 - `cat`、`more`、`less`、`head`和`tail`:查看文件内容 3. 理解命令的结构:大部分Linux命令遵循一定的格式,如`command -options arguments`,了解这个结构有助于学习和记忆命令。 4. 使用手册页(man pages):对于每个命令,都可以通过`man [命令名]`来获取详细的手册页信息,这是学习命令的官方文档。 5. 实践操作:通过实际操作来加深理解,可以在虚拟机或实体机上安装Linux系统,多做实验。 6. 使用在线资源:互联网上有大量的教程、文档和视频,例如CSDN等技术社区,可以找到许多学习Linux的资源。 7. 练习编写脚本:通过编写简单的shell脚本,可以加深对命令的理解,并学习如何将多个命令组合起来完成复杂任务。 8. 定期复习:定期回顾你已经学习的命令和概念,以避免遗忘。 9. 设置目标:给自己设定一些小项目,比如配置一个Web服务器,管理用户账号等,通过具体的目标来驱动学习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值