Go에서 스캐너를 사용하여 특정 줄에서 파일 읽기를 재개하는 방법은 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-06 04:15:02
원래의
316명이 탐색했습니다.

How to Resume Reading a File from a Specific Line Using the Scanner in Go?

스캐너를 사용하여 특정 줄 번호에서 파일 읽기

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!