通常当我们fmt.Scanf()
在 Golang 中调用时,程序会从标准输入流中读取,即os.stdin
我想通过 Golang 代码fmt.Scanf()
从文件流中读取 - 类似于Python 中的一种技术 here。
请注意,我们在命令行级别有管道解决方法;在这里,我正在寻找 Golang 代码解决方案。
如果你知道如何到达那里,请分享。
ps
我想这需要我们
bytes
bytes
给os.stdin
流虽然我是 Golang 新手,我的谷歌搜索不是很有帮助,所以我在这里问。
os.Stdin
如果这确实是您想要的:os.Stdin
是一个*os.File
您可以根据自己的喜好修改的变量(类型),您可以为其分配一个新值。打开一个文件并将其分配给os.Stdin
,fmt.Scanf()
将直接从该文件中读取。有关详细信息,请参阅填充 os.Stdin 以获取从中读取的函数。
这是一个完整的示例,它打开一个名为 的文件a.txt
,将其设置为os.Stdin
,然后调用从(间接从文件中)fmt.Scanf()
读取string
值。下面的代码还处理保存和恢复. 这里不需要,但是可以作为一个例子,临时修改全局的东西恢复一下也是一个好习惯。os.Stdin
a.txt
os.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
文件的内容。