Setting a file as os.Stdin
If this is truly what you want: os.Stdin
is a variable (of type *os.File
) which you can modify to your liking, you can assign a new value to it. Opening a file and assigning it to os.Stdin
, fmt.Scanf()
will read directly from that file. For details, see Fill os.Stdin for function that reads from it.
Here's a complete example which opens a file named a.txt
, sets it as os.Stdin
, then calls fmt.Scanf()
to read a string
value from os.Stdin
(indirectly from the a.txt
file). The code below also handles saving and restoring the original value of os.Stdin
. It is not needed here, but it serves as an example, and it's also good habit to restore global things you modify temporarily.
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)
Note that you can also redirect os.Stdout
to a file like:
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())
Using fmt.Fscanf()
An easier, better alternative would be to use fmt.Fscanf()
which is analogue to fmt.Scanf()
, but here you can also pass an io.Reader
to read from, and os.File
implements io.Reader
, so you can directly pass a file to it.
Redirecting a file to the standard input of your app
Another option would be to redirect a file to your app as its standard input when you launch your app. For example:
go run myapp.go < a.txt
This command will start your app, streaming the contents of the a.txt
file to the standard input of your app. And so fmt.Scanf()
will read the contents of the a.txt
file.