为了账号安全,请及时绑定邮箱和手机立即绑定

文件扫描器循环不执行

文件扫描器循环不执行

Go
收到一只叮咚 2023-08-07 14:42:06
我正在获取文本文件的最后一行,并尝试读取它。获取最后一行: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 个扫描仪正在访问同一个文件。
查看完整描述

1 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

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 err

defer file1.Close()


file2, err := os.Open("a.txt")

// handle err

defer file2.Close()


wg := sync.WaitGroup()

wg.Add(1)

go func() {

    defer wg.Done()

    getLastLine(file1)

}()


readFileFrom(file2)


wg.Wait() // Wait for getLastLine() to complete


查看完整回答
反对 回复 2023-08-07
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信