Redirect Golang将fmt.Scanf重定向到从文件而不是os.Stdin读取

Redirect Golang将fmt.Scanf重定向到从文件而不是os.Stdin读取,redirect,go,stdin,Redirect,Go,Stdin,通常,当我们在Golang中调用fmt.Scanf()时,程序将从标准输入流中读取,即os.stdin 通过Golang代码,我想让fmt.Scanf()从文件流读取数据-类似于 请注意,我们有命令行级别的管道解决方案;在这里,我正在寻找在戈朗代码解决方案 如果你知道如何到达那里,请分享 p、 美国 我想这需要我们 从文件流读取并存储在字符串变量字节中 将字节分配给os.stdin流 虽然我是一名Golang新手,但我的帮助不大,所以我在这里询问。将文件设置为os.Stdin 如果这确实是您

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

通过Golang代码,我想让
fmt.Scanf()
从文件流读取数据-类似于

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

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

p、 美国

我想这需要我们

  • 从文件流读取并存储在字符串变量
    字节中
  • 字节分配给
    os.stdin
虽然我是一名Golang新手,但我的帮助不大,所以我在这里询问。

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

下面是一个完整的示例,它打开一个名为
a.txt
的文件,将其设置为
os.Stdin
,然后调用
fmt.Scanf()
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)
请注意,您还可以将
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.Scanf()
,但在这里您也可以传递一个要读取的文件,并且
os.File
实现
io.Reader
,因此您可以直接将文件传递给它

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

go run myapp.go < a.txt
go运行myapp.go

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

我需要坚持
fmt.Scanf()
,即hackerrank.com上的挑战在提交时不使用
fmt.Fscanf
template@NamGVU那么第一个和第三个解决方案对您来说是可行的。如果你无法控制你的应用程序是如何启动的,那么可能只有第一个。而且,我也需要坚持使用命令行中的非管道,即需要在Golang中找到解决方案code@NamGVU好的,你仍然可以使用第一个解决方案。我将重点介绍你的第一个建议-请你详细说明如何存档;我太笨了,我不能告诉自己哪个代码是正确的/最合适的。也许你可以用fmt.Fscanf代替。你可以给它任何你喜欢的io.Reader。@Peter谢谢,但我寻求
fmt.Scanf
解决方案。