我一直在尝试自己学习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)
当前回答
这是一个很好的版本(但请注意,ioutil自Go 1.16以来已弃用):
package main
import (
"io/ioutil";
)
func main() {
contents,_ := ioutil.ReadFile("plikTekstowy.txt")
println(string(contents))
ioutil.WriteFile("filename", contents, 0644)
}
其他回答
请注意。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")
}
这将覆盖文件的内容(如果文件不存在,则创建一个新文件)。
Read方法接受一个字节参数,因为这是它将读入的缓冲区。这是某些圈子里的常用成语,仔细想想还是有道理的。
通过这种方式,您可以确定读取器将读取多少字节,并检查返回值以查看实际读取了多少字节,并适当地处理任何错误。
正如其他人在他们的回答中指出的那样,bufio可能是您从大多数文件读取所需要的。
我再加一个提示,因为它真的很有用。从文件中读取一行的最好方法不是使用ReadLine方法,而是使用ReadBytes或ReadString方法。
[]byte是字节数组的全部或部分的切片(类似于子字符串)。可以将切片看作一个值结构,它带有一个隐藏的指针字段,用于系统定位和访问数组(切片)的全部或部分,加上用于切片长度和容量的字段,您可以使用len()和cap()函数访问这些字段。
这里有一个工作的入门套件,它可以读取和打印二进制文件;您将需要更改inName字面值以引用系统上的一个小文件。
package main
import (
"fmt";
"os";
)
func main()
{
inName := "file-rw.bin";
inPerm := 0666;
inFile, inErr := os.Open(inName, os.O_RDONLY, inPerm);
if inErr == nil {
inBufLen := 16;
inBuf := make([]byte, inBufLen);
n, inErr := inFile.Read(inBuf);
for inErr == nil {
fmt.Println(n, inBuf[0:n]);
n, inErr = inFile.Read(inBuf);
}
}
inErr = inFile.Close();
}
请注意。由于Go 1.16 ReadFile在os包中。
试试这个:
package main
import (
"io";
)
func main() {
contents,_ := io.ReadFile("filename");
println(string(contents));
io.WriteFile("filename", contents, 0644);
}
这是一个很好的版本(但请注意,ioutil自Go 1.16以来已弃用):
package main
import (
"io/ioutil";
)
func main() {
contents,_ := ioutil.ReadFile("plikTekstowy.txt")
println(string(contents))
ioutil.WriteFile("filename", contents, 0644)
}