1. 标准输入输出
os提供了标准输入输出文件:
Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout") Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr")
func NewFile(fd uintptr, name string) *File
2. os包读取文件
文件使用os.File类型的指针来表示,也叫作文件句柄。File是struct,表示一个open file descriptor。标准输入输出os.Stdin/os.Stdout都是*os.File。
os.File与unix file descriptor fd使用类似,但不能共同使用。golang中用os.File封装或代替unix fd。
func NewFile(fd uintptr, name string) *File
NewFile returns a new File with the given file descriptor and name. The returned value will be nil if fd is not a valid file descriptor.
func (f *File) Fd() uintptr
Fd returns the integer Unix file descriptor referencing the open file. The file descriptor is valid only until f.Close is called or f is garbage collected.
On Unix systems this will cause the SetDeadline methods to stop working.
os包包含操作文件的最底层处理函数,类似unix系统调用。
type File struct {
// contains filtered or unexported fields
}
func Open(name string) (*File, error)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
func (f *File) Read(b []byte) (n int, err error)
func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteString(s string) (n int, err error)
Open()默认的mode为O_RDONLY。
Read reads up to len(b) bytes from the File. It returns the number of bytes read and any error encountered. At end of file, Read returns 0, io.EOF.
Write writes len(b) bytes to the File. It returns the number of bytes written and an error, if any. Write returns a non-nil error when n != len(b).
3. io/ioutil包读取文件
ioutil将整个文件的内容读到一个内存中。
func ReadFile(filename string) ([]byte, error)
func WriteFile(filename string, data []byte, perm os.FileMode) error
示例:
package main
import (
"fmt"
"io/ioutil"
)
func main(){
// data, err := ioutil.ReadFile("/home/golang/file/test.txt")
data, err := ioutil.ReadFile("./test.txt")
if err != nil {
fmt.Println("File reading error", err)
return
}
fmt.Println("Contents of File:", string(data))
}
4. bufio包缓冲读取(buffered reader)文件
var inputReader *bufio.Reader
var input string
var err error
inputReader = bufio.NewReader(os.Stdin)
fmt.Println("Please Enter some input:")
input, err = inputReader.ReadString(‘\n‘)
if err == nil {
fmt.Printf("The input was: %s\n", input)
}
inputFile, inputError := os.Open("test.txt") if inputError != nil { fmt.Printf("An error occurred on openning th inputfile\n") return } defer inputFile.Close() inputReader := bufio.NewReader(inputFile) for { inputString, readerError := inputReader.ReadString(‘\n‘) if readerError == io.EOF { return } fmt.Printf("The input was: %s", inputString) }
相关函数:
func NewReader(rd io.Reader) *Reader
func (b *Reader) ReadString(delim byte) (string, error)
func (b *Reader) ReadByte() (byte, error)
func (b *Reader) ReadBytes(delim byte) ([]byte, error)
func (b *Reader) Read(p []byte) (n int, err error)
ReadString(delim byte)从输入中读取内容,直到碰到 delim 指定的字符,然后将读取到的内容连同 delim 字符一起放到缓冲区。ReadBytes()类似,但ReadByte()仅读取一个字节。
ReadString()只能读取字符串,Read()可以读取任何数据,包括二进制文件。
r := bufio.NewReader(f)
b := make([]byte, 3)
for {
_, err := r.Read(b) //每次读取3个字节
if err != nil {
fmt.Println("Error reading file:", err)
break
}
fmt.Println(string(b))
}
bufio逐行读取文件
f, err := os.Open("./test.txt")
if err != nil {
log.Fatal(err)
}
defer func() {
if err = f.Close(); err != nil {
log.Fatal(err)
}
}()
s := bufio.NewScanner(f)
for s.Scan() {
fmt.Println(s.Text())
}
err = s.Err()
if err != nil {
log.Fatal(err)
}
相关函数:
func NewScanner(r io.Reader) *Scanner
func (s *Scanner) Scan() bool
func (s *Scanner) Text() string
NewScanner returns a new Scanner to read from r. The split function defaults to ScanLines.
参考:
1. https://golang.google.cn/pkg/fmt/#Scanln
2. https://www.kancloud.cn/kancloud/the-way-to-go/72678
3. https://studygolang.com/subject/2
原文:https://www.cnblogs.com/embedded-linux/p/11620308.html