gpt4 book ai didi

文件扫描器循环不执行

转载 作者:行者123 更新时间:2023-12-03 01:26:25 25 4
gpt4 key购买 nike

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

获取最后一行:

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)

它不会执行该 block :

for s.Scan() {
fmt.Println(s.Text())
}

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

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

最佳答案

os.File 维护下一个读或写操作将工作的位置。读取/写入文件会更新此位置。

如果您使用单个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

关于文件扫描器循环不执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59030891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com