前言
这次的作业对于我这种菜鸡来说难度有点大,虽然老师给的参考资料已经很详细的介绍了,selpg的功能、c和python的实现方法。但是真正轮到自己做的时候,还是会有一种无从下手的感觉。由于自己很多地方理解的不到位,所以如果下面的叙述有问题,希望大家指正。
什么是selpg
简单来说,selpg 就是与 ls 、mkdir 等一样的实用的命令行程序,它可以读取终端输入或文件输入,然后根据给定参数,打印输入的指定位置。其命令的参数包括强制选项和可选选项两个部分,格式如下:
-sstart_page -eend_page [ -f | -l lines_per_page ][ -d dest ] [ in_filename ]
强制选项——要求用户在使用命令时一定要加的参数
-s+start_page
,start_page表示开始页面的页号,为int类型-e+end_page
,end_page表示结束页面的页号,也为int类型
- 需要确保
start_page
和end_page
均大于1,且start_page <= end_page
可选选项——在使用时不一定要加的参数
-l+row_num
,row_num表示多少行分为一页-f
,代表按照分页符(ASCII 为12)分页-d+Destination
,表示选定的页直接发送至打印机filename
,表示选取的文件名
- 当
-l
与-f
命令都不存在时,会将页面长度设置为默认长度(默认长度为10行) -l
与-f
命令是互斥的,不可以同时存在
实现难点
了解
flag
和Pflag
的区别,使用Pflag
绑定参数,对命令行参数进行解析- 对于
Pflag
的使用可以算是这次作业最关键的部分,看懂了这一部分,就基本可以明白怎么去实现这次作业。老师在网站中也给了很详细的介绍 - 标准库——命令行参数解析FLAG
- Go学习笔记:flag库的使用
- Golang使用之Flag和Pflag
- 对于
实现文件读取与写入的操作
- 文件的读取个人比较推荐使用
bufio
库,因为其操作与C语言的文件读取类似,老师的博客中有C语言的源码,所以对我这种代码水平比较低的人来说,会简单很多。 - golang中 bufio 包的用法
- go语言在终端读取数据
- 文件的读取个人比较推荐使用
命令的异常处理
- 命令的异常处理其实就是对与不同的输入情况,进行if条件的分类。其主要的难度在于要怎样使得用尽可能少的if语句,来实现正确的结果
如何使用 pipe 完成打印输出的任务
- 其实这个,我自己也不是很会,但是大佬告诉我,使用 exec 库的 command,可以调用子进程执行终端命令。大佬博客在这里,大家可以去看看,肯定比我写的好
代码实现
- 引入需要的包
1 | import ( |
- 创建对应的结构体
1 | type selpg_args struct { |
- 利用
pflag.Parse()
绑定参数并解析
1 | pflag.IntVarP(&sa.start_page,"start", "s", 0, "Start page of file") |
- 输入参数处理
1 | func process_args(args []string) { |
- 文件读取处理
1 | func process_input() { |
- 主函数
1 | func main() { |
部分程序测试截图
- 由于程序测种类较多,下面只有部分测试,有兴趣的话,可以来这里自己运行一下
./selpg -s1 -e1 test.txt
- 缺省行数控制./selpg -s2 -e2 -l15 test.txt
- 控制每页15行./selpg -s1 -e1 -f test.txt
- 以分页符作为分页标准
./selpg -s1 -e1 -l15 test.txt > out.txt
- 将输出定向到 out.txt 文件中
./selpg -s1 test.txt 2> error.txt
- 将错误输出定向到error.txt 中
./selpg -s2 -e2 -dcat test.txt
- cat命令
体会
- 这次作业对我来说的挑战,不仅包括作业本身的难度,还有对go语言语法的不够熟悉。所以花费了很多时间,在go语言的语法上。
- 看了很多大佬的实现,和他们还是有很大的差距。不管是功能实现还是异常处理上,都还有很大的差距
- 不过自己能做完这次作业已经很开心了,嘿嘿