Io 程序只打印输入文件的最后一个字符串

Io 程序只打印输入文件的最后一个字符串,io,go,Io,Go,我试图创建一个简单的程序来读取文本文件中的行,并将它们打印到golang中的控制台。我花了很多时间检查我的代码,我简直不明白为什么只有最后一行被打印到屏幕上。有人能告诉我哪里出了问题吗?这里的一切都应该编译并运行 package main import ( "bufio" "fmt" "os" ) func Readln(r *bufio.Reader) (string, error) { var ( isPrefix bool = true

我试图创建一个简单的程序来读取文本文件中的行,并将它们打印到golang中的控制台。我花了很多时间检查我的代码,我简直不明白为什么只有最后一行被打印到屏幕上。有人能告诉我哪里出了问题吗?这里的一切都应该编译并运行

package main

import (
    "bufio"
    "fmt"
    "os"
)

func Readln(r *bufio.Reader) (string, error) {
    var (
        isPrefix bool  = true
        err      error = nil
        line, ln []byte
    )
    for isPrefix && err == nil {
        line, isPrefix, err = r.ReadLine()
        ln = append(ln, line...)
    }
    return string(ln), err
}

func main() {
    f, err := os.Open("tickers.txt")
    if err != nil {
        fmt.Printf("error opening file: %v\n", err)
        os.Exit(1)
    }
    r := bufio.NewReader(f)
    s, e := Readln(r)
    for e == nil {
        fmt.Println(s)
        s, e = Readln(r)
    }
}

因此,我怀疑问题出在您的
tickers.txt
文件行结尾。ReadLine()的文档还表明,在大多数情况下,扫描仪更适合

以下问题提供了一些关于替代实施的有用信息:

然后,我使用上述问题中的示例重新实现您的主要功能,如下所示:

f, err := os.Open("tickers.txt")
if err != nil {
    fmt.Printf("error opening file: %v\n", err)
    os.Exit(1)
}

scanner := bufio.NewScanner(f)
for scanner.Scan() {
    fmt.Println(scanner.Text())
}

if err := scanner.Err(); err != nil {
    fmt.Println(err)
}

你能提供更多关于你看到的问题的信息吗?我下载并运行了你的程序,它的行为似乎与我提供的数据相符。我有一个大约100个字符串的文本文件,只有文本文件的最后一行显示在控制台上。我想把文本文件复制到屏幕上。相反,只显示最后一个字符串。文件中的行尾字符是什么?您可以使用查看实际的文件编码,然后将其添加到您的问题中,这将有助于其他人测试它。您确定这一点吗?我调整了海报的程序,添加了一些额外的调试输出,它肯定会逐行读取文件。当我将缓冲区调整为比我拥有的行短时,
isPrefix
部分似乎工作正常:如果返回的是部分行,而不是最后一行,则设置为true。@JamesHenstridge,你是对的,我在添加调试时已经编辑了示例。所以它是逐行阅读。编辑了我的答案。