File 文件扫描程序循环不执行
我正在获取文本文件的最后一行,并尝试读取它 获取最后一行:File 文件扫描程序循环不执行,file,go,File,Go,我正在获取文本文件的最后一行,并尝试读取它 获取最后一行: 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 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(文件)
readFileFrom(文件)
它不会执行以下块:
s.Scan()的{
fmt.Println(s.Text())
}
如果我删除了行getLastLine(文件)
,则读取效果与预期一样
我认为这是因为两台扫描仪正在访问同一个文件。保持下一次读写操作的位置。读取/写入文件将更新此位置
如果使用单个文件
,将其传递到getLastLine()
将一直读取到文件末尾,因此其指针将指向文件末尾。现在将其传递到readFileFrom()
将不会读取和打印任何内容,因为文件结尾后没有更多数据(这是“结束”的定义)
您需要使用倒带指针,或者需要关闭并重新打开它。显然,只是倒带更有效。要设置指向文件开始的指针,请执行以下操作:
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
getLastLine(文件)一直读取到文件末尾。readFileFrom中没有更多的内容可以读取。@peter这是否意味着我只能为每个文件读取一次文件?因此,我需要将这两个函数合并为1?