回答

收藏

如何读取文本文件?

技术问答 技术问答 421 人阅读 | 0 人回复 | 2023-09-12

我试着读我在读file.txt”并使用 Golang 将内容放入变量中。这是我试过的…( ]8 h1 T) e( G
    package mainimport  "fmt"    "os"    "log")func main()      file,err := os.Open("file.txt")    if err != nil              log.Fatal(err)    }    fmt.Print(file)}1 X% f& k+ R* |1 o) g( b' J
从os.Open返回的返回类型为*os.File
. c1 I6 q8 H3 _' ?4 x7 P                                                                0 ?9 d, ?8 u/ a$ f! Y
    解决方案:                                                                ' q; o) f( `) `, }- g7 w& D
                                                                这取决于你想做什么。
" {5 O* p1 u9 k% G3 n. T
    file,err := os.Open("file.txt")fmt.print(file)0 {/ l6 H4 S7 t# _3 O* |5 w
它输出 &{0xc082016240} 的原因是你正在打印文件描述符 ( *os.File)指针值,而不是文件内容。你可以获得文件内容READ从文件描述符中获取。
6 @3 e7 e; L% }/ y6 E/ `0 \在内存中读取所有文件内容(以字节为单位),ioutil.ReadAll
5 y" U, ?* N' I4 a) F
    package mainimport  "fmt"    "io/ioutil"    "os"    "log")func main()      file,err := os.Open("file.txt")    if err != nil              log.Fatal(err)   }    defer func()          if err = file.Close(); err != nil                  log.Fatal(err)       }    }()  b,err := ioutil.ReadAll(file)  fmt.Print(b)}  H, t$ c; O6 L! c( [7 E
但有时,如果文件很大,只读块可能会节省更多的内存:缓冲区的大小,所以你可以使用它io.Reader.Readfrom的实现*os.File0 M" K: \0 v  h
[code]func main()      file,err := os.Open("file.txt")    if err != nil              log.Fatal(err)   }    defer func()          if err = file.Close(); err != nil                  log.Fatal(err)       }    }()    buf := make([]byte,32*1024) // define your buffer size here.    for              n,err := file.Read(buf)        if n > 0                  fmt.Print(buf[:n]) // your read buffer.       }        if err == io.EOF                  break       }        if err != nil                  log.Printf("read %d bytes: %v",n,err)            break      code]否则,您也可以使用标准 util 包:bufio,try Scanner。AScanner阅读您的文件:分隔符。' T1 b/ J( u3 A1 u. M6 A
默认情况下,扫描仪通过换行符推进标记(当然,你可以定制扫描仪如何标记你的文件,从这里学习bufio 测试)。
0 H2 r$ `# d& r% f* H9 s[code]package mainimport  "fmt"    "os"    "log"    "bufio")func main()      file,err := os.Open("file.txt")    if err != nil              log.Fatal(err)   }    defer func()          if err = file.Close(); err != nil                  log.Fatal(err)       }    }()    scanner := bufio.NewScanner(file)    for scanner.Scan()               // internally,it advances token based on sperator        fmt.Println(scanner.Text() // token in unicode-char        fmt.Println(scanner.Bytes() // token in bytes  code]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则