读取文本文件时不输出,压缩文件时正常输出,问题在哪?
`fmt.Println("txt file")`
`fmt.Println("compressed file")`
这两句也可以正常打印出来。
```
package main
import (
"fmt"
"io"
"os"
"bufio"
"compress/gzip"
)
func main(){
fp, fpEr := os.Open(os.Args[1])
if fpEr != nil {
fmt.Println(fpEr.Error())
return
}
defer fp.Close()
var reader *bufio.Reader
fz, fzEr :=gzip.NewReader(fp)
if fzEr != nil {
//fmt.Println(fzEr.Error())
reader = bufio.NewReader(fp)
fmt.Println("txt file")
}else{
reader = bufio.NewReader(fz)
fmt.Println("compressed file")
}
for {
line, lineEr := reader.ReadString('\n')
if lineEr == io.EOF {
return
}
fmt.Printf("%s", line)
}
}
```
题主这个问题蛮好的。
1 我一开始的猜想是,经过了
```
fz, fzEr :=gzip.NewReader(fp)
```
的处理,fp 的文件读偏移量发生了变化,导致后续被
```
reader = bufio.NewReader(fp)
```
处理时,无法正常完成。调试时,却没有准确的信息以辅助分析
2 后来,在
```
reader = bufio.NewReader(fp)
```
之前加了一行
```
fp.Seek(0, 0)
```
,将 fp 的文件读偏移量显式的重置回起始处,发现可以正常打印了,看来确实是由于前一步的
```
gzip.NewReader
```
导致了发生偏移。
3 看了下
```
gzip.NewReader
```
的 相关文档,
```
// NewReader creates a new Reader reading the given reader.
// If r does not also implement io.ByteReader,
// the decompressor may read more data than necessary from r.
```
只能说略有收货,不知道有没有人可以明确的指出偏移量是哪个参数
#3
更多评论