代码之家  ›  专栏  ›  技术社区  ›  Nam G VU

Golang重新引导fmt。Scanf从文件而不是操作系统中读取。标准DIN

  •  3
  • Nam G VU  · 技术社区  · 7 年前

    通常我们打电话的时候 fmt.Scanf() 在Golang中,程序将读取标准输入流,即。 os.stdin

    我想,根据Golang代码 从文件流读取-类似于 technique in Python here .

    请注意,我们在命令行级别有管道解决方案;在这里,我正在寻找在Golang代码解决方案。

    附笔

    我想这需要我们

    • 从文件流读取并存储在字符串变量中 bytes
    • 字节数 流动

    虽然我是个刚学打高尔夫球的人 google search 不是很有帮助,所以我在这里问。

    1 回复  |  直到 7 年前
        1
  •  8
  •   icza    7 年前

    将文件设置为 os.Stdin

    操作系统。标准DIN *os.File )您可以根据自己的喜好对其进行修改,您可以为其指定一个新值。打开文件并将其分配给 操作系统。标准DIN , fmt.Scanf() 将直接从该文件中读取。有关详细信息,请参阅 Fill os.Stdin for function that reads from it

    下面是一个完整的示例,它打开了一个名为 a.txt ,将其设置为 ,然后调用 阅读 string 来自的值 操作系统。标准DIN (间接来自 a、 txt文件 操作系统。标准DIN

    f, err := os.Open("a.txt")
    if err != nil {
        panic(err)
    }
    defer f.Close()
    
    oldStdin := os.Stdin
    defer func() { os.Stdin = oldStdin }()
    
    os.Stdin = f
    
    var s string
    if _, err := fmt.Scanf("%s", &s); err != nil {
        fmt.Printf("Error reading: %v", err)
    }
    fmt.Println("Read:", s)
    

    注意,您还可以重定向 os.Stdout

    f2, err := os.Create("out.txt")
    if err != nil {
        panic(err)
    }
    defer f2.Close()
    
    oldStdout := os.Stdout
    defer func() { os.Stdout = oldStdout }()
    
    os.Stdout = f2
    
    fmt.Printf("This will be written to the file: %s", f2.Name())
    

    使用 fmt.Fscanf()

    一个更简单、更好的选择是使用 fmt.Fscanf() 这与 io.Reader 阅读,以及 os.File 机具 ,因此您可以直接将文件传递给它。

    将文件重定向到应用程序的标准输入

    go run myapp.go < a.txt
    

    此命令将启动你的应用程序,流式传输 fmt。Scanf() 将阅读 文件