代码详情我的Github
1.概述
Selpg从标准输入或从作为命令行参数给出的文件名读取文本输入。它允许用户指定来自该输入并随后将被输出的页面范围。例如,如果输入含有 100 页,则用户可指定只打印第 35 至 65 页。这种特性有实际价值,因为在打印机上打印选定的页面避免了浪费纸张。另一个示例是,原始文件很大而且以前已打印过,但某些页面由于打印机卡住或其它原因而没有被正确打印。在这样的情况下,则可用该工具来只打印需要打印的页面。
2.函数分析
- Parser函数——用于解析命令行参数。
- processArgs函数——大量的错误检查以使它尽可能的健壮。
- usage函数——显示输入样例
- process_input函数选择所需的页并将其写至指定的目的地
3.参数解析
本次实验的参数解析运用了Go语言中的flag包来进行解析,举个例子
flag.IntVar(&p.start_page, “s”, -1, “首页号”)
当输入的参数没有-s的选项,start_page的值则默认为-1;倘若有-s选项,如-s=1或-s 1,则会自动识别-s之后的数字并将start_page赋值为1。
命令行flag的语法有如下三种形式:
-flag // 只支持bool类型
-flag=x
-flag x // 只支持非bool类型
关于更多flag的使用请点击链接。命令行参数解析
测试
为了测试方便,page_len的默认值改为5,输出的每页行数为5
测试文件(在第3、8、12和15行的尾部各有一个换页符/f):
1.
./selpg -s=1 -e=1 in
该命令将把“input_file”的第1页写至标准输出(也就是屏幕),因为这里没有重定向或管道。page_len为5,所以第一页打印了5行line,中间空行是因为换页符的存在。
2.
./selpg -s=1 -e=1 < in
该命令与示例 1 所做的工作相同,但在本例中,selpg 读取标准输入,而标准输入已被 shell/内核重定向为来自“input_file”而不是显式命名的文件名参数。输入的第 1 页被写至屏幕,输出效果同上。
3.
cat in | ./selpg -s=1 -e=1
“cat”的标准输出被 shell/内核重定向至 selpg 的标准输入。将第 1 页写至 selpg 的标准输出(屏幕)。
4.
./selpg -s=1 -e=1 in > out
selpg 将第 1页写至标准输出,标准输出被shell/内核重定向至“out”。输出没有在命令行显示,而是显示在输出文件中。
5.
./selpg -s=1 -e=-1 in 2> error
把end_page设为-1,发生错误,所有的错误消息被 shell/内核重定向至“error”。
6.
./selpg -s=1 -e=1 in > out 2> error
selpg 将第1页写至标准输出,标准输出被重定向至“out”, 发生的“错误”写至error(实际上没有错误,“done!”只是为了演示)。
7.
./selpg -s=1 -e=1 in > out 2>/dev/null
selpg 将第 1页写至标准输出,标准输出被重定向至“out”,丢弃错误信息。可见成功输出到out文件,而error文件为空。
8.
./selpg -s=1 -e=1 in > /dev/null
标准输出被丢弃
9.
./selpg -s=1 -e=1 in | wc
selpg 的标准输出透明地被 shell/内核重定向,成为“wc”的标准输入,显示第一页中包含的行数、字数和字符数。
10.
./selpg -s=1 -e=1 in 2> error | wc
同上,唯一不同就是错误消息被写至“error_file”。
11.
./selpg -s=1 -e=1 -l=2 in
输出的页长设置为2行,可见输出了一页为2行的信息。
12.
./selpg -s=1 -e=2 -f in
页面由换页符定界。第1页到第2页被写至 selpg 的标准输出。
13.
./selpg -s=1 -e=2 -d=lp1 in
由于缺少打印机,用cat命令代替lp命令,结果正确。
14.
./selpg -s=1 -e=2 in > out 2> error &
selpg后台运行正常。