为了加深一下对linux下常规命令的理解顺带写作业,就用c语言模拟了一下tail命令。

首先简单介绍一下tali命令的用法。
tail test.txt:显示test.txt文件的最后十行
tail -n 5 test.txt:显示test.txt文件最后五行
当然tail命令还有tail -f 这个用法,用于实时更新文件的最后十行,不过为了偷懒就没写了,思路差不多,只是需要隔一段时间重新刷新一下。

同时,如果后面给的文件路径或者文件名等写错了,或者写的参数不正确,导致参数错误或文件找不到的话,也会有提示信息。

作为小白,下面写的内容只要会c语言基本语法就能看懂,不会的地方我均写了解释或者放上了参考文档。

废话不多说,开始讲解思路:

1、初始化默认读取长度line=10,如果使用了-n参数设置了长度为x,那么就让line=x

2、一行一行读取文件并保存在数组。但是我是模拟了一下循环数组,即当数组长度达到line了就将数组下一次写入的位置下标设置为0,这样在一定程度上保证了不会因为文件太大而溢出。
举个例子:假如文件一共15行,保存文件每一行数据的数组为char buffer[][],第0-9行存放在buffer[0][] - buffer[9][] 之中,但是第10行数据又会被保存到buffer[0][]中,因为最后只需要输出10行即可,所以只需要保存距离当前位置的最后十行。不过为了输出时候保证位置正确,肯定是要记录数组下标的。

3、开始输出了,输出是对buffer数组进行循环遍历,循环的次数等于min(line,文章行数)。
然后从前面保存的下标开始输出即可。

思路清晰了,就到了具体实现中存在的问题了。
首先,main函数的参数是什么意思?
请参考:http://blog.csdn.net/yhawaii/article/details/7361302
然后,既然需要读取-n 5 文件路径 这些信息,而且并不知道-n 5这样的参数是否会存在,如何解决?
请参考:https://www.cnblogs.com/qingergege/p/5914218.html
再之后,如何一行一行读取文件?
有两个思路,使用read,或者是用fgets。我们要求是使用read的,但是太麻烦了,我偷懒就还是使用fgets了。下面先简要介绍一下用read实现的思路:
想了解一下read的童鞋请参考:

read的配套用法——open详解
read的用法详解
1) 定义一个缓冲区,用read将文件全部存入缓冲区再通过\n来识别换行。明显的一个缺陷就是当文件太大的时候缓冲区会存不下,浪费了存储空间。
2) 每次读一个字符,然后保存到一个临时缓冲队列里,读取到第一个\n后将缓冲队列里的数据当成一行存储。缺点在于效率低下。
这两种思路是在一个论坛里总结出来的,论坛链接

总之使用read是很麻烦的一件事

,所以接下来还是老实使用fgets吧。
这个就很简单啦,参考: fgets读取文件

可运行源代码

最后就是我的源码咯,头文件可能多了点,因为原来使用read加上去的,但是嫌read太麻烦还是改成fgets了。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#define BUFFSIZE 512int main(int argc,char **argv)
{char c;int line = 10;int count = 0;char buffer[BUFFSIZE][BUFFSIZE];//如果有-n,就将line的默认值改了。这里有错误默认是会自动提示的。while((c=getopt(argc,argv,"n:"))!=-1){int x = atoi(optarg);line = x;}//获取文件路径,optind是某个头文件里的东西,不是我定义的,指示的是argv中下一个要读取的数据的下标char *path = argv[optind];FILE *fp;int index = 0;//如果文件打开不成功,肯定是文件没找到,就报错if((fp = fopen(path,"r")) == NULL){printf("File dosen't exit!");return -1;}//下面就是前面讲的思路了,读取文件保存到数组while(!feof(fp)){count++;fgets(buffer[index],BUFFSIZE,fp);if(index+1 >= line){index = 0;}else{index++;    }}//记得关闭fpfclose(fp);int i;if(count < line){line = count;}//因为前面是用的++,多加了1if(index != 0){index--;}for(i = 0;i<line;i++){printf("%s",buffer[index++]);if(index >= line){index = 0;}}}

运行如图:

linux下使用c语言模拟tail [-n] 命令相关推荐

  1. lua读取linux文件内容,使用lua模拟tail -n命令读取最后n行

    文章目录 [隐藏] 实现思路 lua代码 用法 最近需要使用lua读取文件的最后n行数据,但不想调用linux中的tail命令来获取,于是使用纯lua来实现. 实现思路 把文件指针偏移距离文件尾x个字 ...

  2. linux下进程调度算法实验,Linux下进程调度算法的模拟实现.doc

    Linux下进程调度算法的模拟实现 枣 庄 学 院 信息科学与工程学院课程设计任务书 题目: Linux下进程调度算法的模拟实现 学 生1: 学 生2: 学 生3: 专 业: 计算机应用技术 课 程: ...

  3. linux下的C语言开发

    在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...

  4. Mysql —— linux下使用c语言访问mySql数据库

    示例1: #include<stdio.h> #include<mysql.h> int main() { MYSQL mysql; mysql_init(&mysql ...

  5. linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程

    linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程 server.c #include <sys/stat.h>#include <fcntl.h> ...

  6. Third Week :Linux下的C语言

    Linux下的C语言 1. 搭建C语言开发环境/运行环境 1. 文本编辑 2. 编译器 3. 头文件和系统预装文件 4. make 工具 5. echo 2. 标准输入流/输出流/错误流 1. 重定向 ...

  7. linux c语言 信号,linux下基于C语言的信号编程实例

    搜索热词 本文实例讲述了linux下基于C语言的信号编程方法.分享给大家供大家参考.具体如下: #include #include #include #include #include void si ...

  8. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  9. c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

    求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束 /* 以下是主要的逻辑代码,还有些.c和.h就没发了 ...

最新文章

  1. TensorFlow四种Cross Entropy算法实现和应用
  2. vue中使用MD5加密
  3. android android:process=,关于android:Android-appprocess的使用
  4. redhat nginx php mysql_redhat7+nginx+mysql+php
  5. discuz中,修改admin密码
  6. Appointment over SMS on Windows Mobile
  7. linux关闭交互模式,linux – 关闭cp(copy)命令的交互模式(cp:overwrite?)
  8. php错误没有进入catch,php – 致命错误:没有try / catch块的未捕获异常
  9. SAP License:新总账
  10. Python学习总结(2)——变量
  11. ensp查看历史配置命令_华为eNSP配置基本命令
  12. c语言所有逻辑符号大全,C语言中的逻辑取反是“~”符号吗逻辑或是“|”符号吗?...
  13. HTTP长连接---requests的长连接
  14. 中了磁碟机病毒,惨啊!!!
  15. 卷积神经网络 —— 图像识别与深度学习
  16. 【综述】方面级情感分析 Aspect-level Sentiment Classification
  17. linux pkg文件,pkg文件结构详细解释(转)
  18. VR技术在数据中心3D机房中的应用(下)
  19. SpringBoot多文件压缩包下载(多附件zip格式)
  20. SSM源码分析之Spring02-Spring源码分析前瞻

热门文章

  1. python利用itchat接口和pyecharts包进行数据可视化
  2. M y s q l 篇
  3. 想教小学计算机面试报哪个,小学教师资格证面试,建不建议考信息技术?
  4. 卡罗拉 (COROLLA) - 灯光开关
  5. 第 338 场周赛 (力扣周赛)
  6. [展览人周刊]华展云20170612期
  7. EXCEL函数篇 跨工作表统计数据
  8. 现在学UI设计有前途吗?UI设计收入大概多少
  9. 我读过的最好的epoll讲解--转自知乎
  10. 通过python我实现了照片转化为动漫模式,媳妇儿再也不用愁没有好看的头像了~