猿问

文件扫描器循环不执行

我正在获取文本文件的最后一行,并尝试读取它。


获取最后一行:


func getLastLine(file *os.File) (result int) {

    s := bufio.NewScanner(file)

    result = 0

    for s.Scan() {

        result++

    }

    err := s.Err()

    if err != nil {

        log.Fatal(err)

    }

    return

}

读取文件:


func readFileFrom(file *os.File) {

    s := bufio.NewScanner(file)

    for s.Scan() {

        fmt.Println(s.Text())

    }


    err := s.Err()

    if err != nil {

        log.Fatal(err)

    }

}

如果我把这个写在main.go:


    getLastLine(file)

    readFileFrom(file)

它不会执行该块:


for s.Scan() {

    fmt.Println(s.Text())

}

如果我删除该行getLastLine(file),则读取将按预期进行。


我认为这是因为 2 个扫描仪正在访问同一个文件。


收到一只叮咚
浏览 83回答 1
1回答

慕码人2483693

os.File维护下一个读或写操作将工作的位置。读取/写入文件会更新此位置。如果您使用 single file,将其传递给getLastLine()将读取它直到其末尾,因此它的指针将指向文件的末尾。现在将其传递给readFileFrom()将不会读取和打印任何内容,因为文件末尾之后没有更多数据(这是“结束”的定义)。您需要使用 倒回指针File.Seek(),或者需要关闭并重新打开它。显然,仅倒带效率更高。要将指针设置为文件开头:if _, err := file.Seek(0, io.SeekStart); err != nil {    panic(err)}因此,在两个函数调用之间执行此操作:getLastLine(file)if _, err := file.Seek(0, io.SeekStart); err != nil {    panic(err)}readFileFrom(file)另请注意,如果您打开文件两次,则无需倒回它,并且您还可以同时运行这两个函数而不会相互干扰,因为它们只读取文件并且每个函数都有自己的指针os.File。file1, err := os.Open("a.txt")// handle errdefer file1.Close()file2, err := os.Open("a.txt")// handle errdefer file2.Close()wg := sync.WaitGroup()wg.Add(1)go func() {    defer wg.Done()    getLastLine(file1)}()readFileFrom(file2)wg.Wait() // Wait for getLastLine() to complete
随时随地看视频慕课网APP

相关分类

Go
我要回答