Golang 重定向 fmt.Scanf 以读取文件而不是 os.Stdin

Nam*_* VU 3 redirect stdin go

通常当我们fmt.Scanf()在 Golang 中调用时,程序会从标准输入流中读取,即os.stdin

我想通过 Golang 代码fmt.Scanf()从文件流中读取 - 类似于Python 中的一种技术 here

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

如果你知道如何到达那里,请分享。

ps

我想这需要我们

  • 从文件流中读取并存储在字符串变量中 bytes
  • 分配bytesos.stdin

虽然我是 Golang 新手,我的谷歌搜索不是很有帮助,所以我在这里问。

icz*_*cza 5

将文件设置为 os.Stdin

如果这确实是您想要的:os.Stdin是一个*os.File您可以根据自己的喜好修改的变量(类型),您可以为其分配一个新值。打开一个文件并将其分配给os.Stdinfmt.Scanf()将直接从该文件中读取。有关详细信息,请参阅填充 os.Stdin 以获取从中读取的函数

这是一个完整的示例,它打开一个名为 的文件a.txt,将其设置为os.Stdin,然后调用从(间接从文件中)fmt.Scanf()读取string值。下面的代码还处理保存和恢复. 这里不需要,但是可以作为一个例子,临时修改全局的东西恢复一下也是一个好习惯。os.Stdina.txtos.Stdin

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)
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以重定向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())
Run Code Online (Sandbox Code Playgroud)

使用 fmt.Fscanf()

一个更简单、更好的替代方法是使用fmt.Fscanf()which 类似于fmt.Scanf(),但在这里您也可以传递 anio.Reader来读取和os.File实现io.Reader,因此您可以直接将文件传递给它。

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

另一种选择是在您启动应用程序时将文件重定向到您的应用程序作为其标准输入。例如:

go run myapp.go < a.txt
Run Code Online (Sandbox Code Playgroud)

此命令将启动您的应用程序,将a.txt文件内容流式传输到应用程序的标准输入。因此fmt.Scanf()将读取a.txt文件的内容。