我一直在尝试自己学习Go,但在尝试读取和写入普通文件时,我被难住了。
我可以到inFile, _:= os。Open(INFILE, 0,0),但实际上获取文件的内容没有意义,因为read函数以[]字节作为参数。
func (file *File) Read(b []byte) (n int, err Error)
我一直在尝试自己学习Go,但在尝试读取和写入普通文件时,我被难住了。
我可以到inFile, _:= os。Open(INFILE, 0,0),但实际上获取文件的内容没有意义,因为read函数以[]字节作为参数。
func (file *File) Read(b []byte) (n int, err Error)
当前回答
使用io。复制
package main
import (
"io"
"log"
"os"
)
func main () {
// open files r and w
r, err := os.Open("input.txt")
if err != nil {
panic(err)
}
defer r.Close()
w, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer w.Close()
// do the actual work
n, err := io.Copy(w, r)
if err != nil {
panic(err)
}
log.Printf("Copied %v bytes\n", n)
}
如果你不想重新发明轮子,io。复制和io。CopyN可以为您服务。如果你检查io的来源。复制函数,它只是打包在Go库中的Mostafa的解决方案之一(实际上是“基本的”解决方案)。不过,他们使用的缓冲区比他大得多。
其他回答
你也可以使用FMT包:
package main
import "fmt"
func main(){
file, err := os.Create("demo.txt")
if err != nil {
panic(err)
}
defer file.Close()
fmt.Fprint(file, name)
}
新方法
从Go 1.16开始,使用os。ReadFile将文件加载到内存中,并使用os。从内存写入文件的WriteFile (ioutil。ReadFile现在调用os。ReadFile,已弃用)。
小心操作系统。因为它将整个文件读入内存。
package main
import "os"
func main() {
b, err := os.ReadFile("input.txt")
if err != nil {
log.Fatal(err)
}
// `b` contains everything your file has.
// This writes it to the Standard Out.
os.Stdout.Write(b)
// You can also write it to a file as a whole.
err = os.WriteFile("destination.txt", b, 0644)
if err != nil {
log.Fatal(err)
}
}
请注意。ioutil自Go 1.16起已弃用。
使用较新的Go版本,读取/写入文件或从文件中写入文件很容易。从文件中读取:
package main
import (
"fmt"
"io/ioutil"
)
func main() {
data, err := ioutil.ReadFile("text.txt")
if err != nil {
return
}
fmt.Println(string(data))
}
写入文件:
package main
import "os"
func main() {
file, err := os.Create("text.txt")
if err != nil {
return
}
defer file.Close()
file.WriteString("test\nhello")
}
这将覆盖文件的内容(如果文件不存在,则创建一个新文件)。
使用io。复制
package main
import (
"io"
"log"
"os"
)
func main () {
// open files r and w
r, err := os.Open("input.txt")
if err != nil {
panic(err)
}
defer r.Close()
w, err := os.Create("output.txt")
if err != nil {
panic(err)
}
defer w.Close()
// do the actual work
n, err := io.Copy(w, r)
if err != nil {
panic(err)
}
log.Printf("Copied %v bytes\n", n)
}
如果你不想重新发明轮子,io。复制和io。CopyN可以为您服务。如果你检查io的来源。复制函数,它只是打包在Go库中的Mostafa的解决方案之一(实际上是“基本的”解决方案)。不过,他们使用的缓冲区比他大得多。
Read方法接受一个字节参数,因为这是它将读入的缓冲区。这是某些圈子里的常用成语,仔细想想还是有道理的。
通过这种方式,您可以确定读取器将读取多少字节,并检查返回值以查看实际读取了多少字节,并适当地处理任何错误。
正如其他人在他们的回答中指出的那样,bufio可能是您从大多数文件读取所需要的。
我再加一个提示,因为它真的很有用。从文件中读取一行的最好方法不是使用ReadLine方法,而是使用ReadBytes或ReadString方法。