处理文件时,通常需要从特定行号继续读取文件。 bufio包中的Scanner类型可以扩展支持该功能。
使用Scanner的问题在于缺乏线路定位功能。但是,我们可以创建一个自定义的 SplitFunc,它根据换行符拆分输入,并返回读取的字符数以维持文件位置。
func scanLinesWithPosition(data []byte, atEOF bool) (advance int, token []byte, err error) { advance, token, err = bufio.ScanLines(data, atEOF) pos += int64(advance) return }
此 SplitFunc 将位置变量递增为数字读取的字符数。
接下来,我们需要修改扫描器以使用我们自定义的 SplitFunc。
func withScannerAtPosition(input io.ReadSeeker, start int64) error { fmt.Println("--SCANNER, start:", start) if _, err := input.Seek(start, 0); err != nil { return err } scanner := bufio.NewScanner(input) scanner.Split(scanLinesWithPosition) for scanner.Scan() { fmt.Printf("Pos: %d, Scanned: %s\n", pos, scanner.Text()) } return scanner.Err() }
中在此示例中,我们读取示例文件并使用行号打印其内容:
func main() { input := strings.NewReader("first\r\nsecond\nthird\nfourth") if err := withScannerAtPosition(input, 0); err != nil { fmt.Println("Scanner error:", err) } }
--SCANNER, start: 0 Pos: 7, Scanned: first Pos: 14, Scanned: second Pos: 20, Scanned: third Pos: 26, Scanned: fourth
以上是如何使用 Go 中的扫描器从特定行继续读取文件?的详细内容。更多信息请关注PHP中文网其他相关文章!