回答

收藏

如何读取文本文件?

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

我试着读我在读file.txt”并使用 Golang 将内容放入变量中。这是我试过的…3 S% Y$ \) T, X% }+ H& Q0 A
    package mainimport  "fmt"    "os"    "log")func main()      file,err := os.Open("file.txt")    if err != nil              log.Fatal(err)    }    fmt.Print(file)}
    , M  m* g7 |/ R$ D
从os.Open返回的返回类型为*os.File2 I% I5 c- ^& {7 t- z. `
                                                                ; U# o/ O4 I" _# [
    解决方案:                                                               
! o, Z; a; G6 v& `" e0 f6 k                                                                这取决于你想做什么。! o* f6 D" d" v$ q4 @# c9 M! _
    file,err := os.Open("file.txt")fmt.print(file)' L2 L# M  y6 j' {- d
它输出 &{0xc082016240} 的原因是你正在打印文件描述符 ( *os.File)指针值,而不是文件内容。你可以获得文件内容READ从文件描述符中获取。0 t. [% o9 S- s3 ~, E( j6 v! ?
在内存中读取所有文件内容(以字节为单位),ioutil.ReadAll
& ~1 r7 Y4 B6 l& X( B4 Z! r2 L6 C: _
    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)}
    " T0 e2 F6 A) x
但有时,如果文件很大,只读块可能会节省更多的内存:缓冲区的大小,所以你可以使用它io.Reader.Readfrom的实现*os.File
, Y( K8 p- }$ g9 ~[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阅读您的文件:分隔符。
5 ?6 E0 n! S- H6 Z$ P$ ?默认情况下,扫描仪通过换行符推进标记(当然,你可以定制扫描仪如何标记你的文件,从这里学习bufio 测试)。0 P+ F2 _  I4 {
[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]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则