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?