使用 golang 开发 selpg

GitHub地址

实验准备

1、安装和导入pflag

使用 go get命令就可以安装pflag包

go get github.com/spf13/pflag
go test github.com/spf13/pflag
import "github.com/spf13/pflag"

flag和pflag都是源自于Google,工作原理和代码实现基本上都是一样的。 flag虽然是Golang官方的命令行参数解析库,但是pflag却得到更加广泛的应用。 因为pflag相对flag支持更加精细的参数类型,例如flag只支持uint和uint64,而pflag额外支持uint8、uint16、int32。pflag支持更多参数类型:ip、ip mask、ip net、count、以及所有类型的slice类型,例如string slice、int slice、ip slice等。所以pflag的使用与flag基本是相同的。

 

实验过程

1、引入需要的包并定义

import(
	"io"
	"os"
	"fmt"
	"bufio"
	"log"
	"os/exec"
	"bytes"
	"github.com/spf13/pflag"
)
type Selpg struct {
	startPage, endPage, pageLines, totalPages int
	destination, inputFile string
	fromFeed bool
}

2、判断有无输入文件的函数

	if sp.inputFile != "" {
		file, err := os.Open(sp.inputFile)
		if err != nil {
			fmt.Printf("%v: Could not open file: %v, %v\n", os.Args[0], sp.inputFile, err)
			os.Exit(1)
		}
		reader = file
	} 
	else {
		reader = os.Stdin
	}
	bufReader := bufio.NewReader(reader)
	bufWriter := bufio.NewWriter(writer)
	var totalPages int

3、判断分页方式函数

if sp.fromFeed {
		currentPage := 1
		for runningFlag := true; runningFlag ;{
			ch, err := bufReader.ReadByte()
			if err != nil {
				if err == io.EOF {
					runningFlag = false
				} 
				else {
					log.Fatalf("Error: %v\n", err)
					os.Exit(1)
				}
			}
			if currentPage >= sp.startPage && currentPage <= sp.endPage {
				bufWriter.WriteByte(ch)
			}
			if ch == '\f' {
				bufWriter.Flush()
				currentPage += 1
			}
		}
		totalPages = currentPage
	} 
	else {
		currentLine := 1
		for runningFlag := true; runningFlag ;{
			line, err := bufReader.ReadString('\n')
			if err != nil {
				if err == io.EOF {
					runningFlag = false
				} else {
					log.Fatalf("Error: %v\n", err)
					os.Exit(1)
				}
			}
			if currentLine >= sp.pageLines*(sp.startPage-1)+1 &&
				currentLine <= sp.totalPages * sp.pageLines {
				bufWriter.WriteString(line)
			}
			bufWriter.Flush()
			currentLine += 1
		}
		totalPages = currentLine / sp.pageLines + 1
	}

4、判断页数是否错误

if totalPages < sp.startPage {
		err = errors.New(fmt.Sprintf("start_page (%v) greater than total pages (%v), no output written", sp.startPage, totalPages))
	} else if totalPages < sp.endPage {
		err = errors.New(fmt.Sprintf("end_page (%v) greater than total pages (%v), less output than expected", sp.endPage, totalPages))
	}
	bufWriter.Flush()
	return err

 

实验结果

1、测试输出1-20行

测试程序

for ((i=1;i<20;i++))
do
echo "line" $i >> test
done

命令

$./selpg --s 1 --e 1 test

实验结果

2、测试复杂一点的

测试程序

for ((i=1;i<20;i += 4))
do
echo "line" $i >> testpage
echo "line" $i+1 >> testpage
echo "line" $i+2 >> testpage
echo "line" $i+3 >> testpage
echo -e '\f' >> testpage
done

命令

$./selpg --s 1 --e 3 testpage

实验结果

 

这样实验就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值