파일 작업을 할 때 특정 줄 번호부터 파일 읽기를 다시 시작해야 하는 경우가 많습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!