回答

收藏

如何读取文本文件?

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

我试着读我在读file.txt”并使用 Golang 将内容放入变量中。这是我试过的…0 X7 J( b1 y/ `2 m1 p9 ?2 f- x; X
    package mainimport  "fmt"    "os"    "log")func main()      file,err := os.Open("file.txt")    if err != nil              log.Fatal(err)    }    fmt.Print(file)}0 {( g" ^% K3 B0 x# q
从os.Open返回的返回类型为*os.File  V6 _. k' u) G; w) ]) ~
                                                                " `, M7 V) n( W2 h6 i- X9 ~0 b& U
    解决方案:                                                               
( o2 m! M6 O4 W/ ^                                                                这取决于你想做什么。
; Y; E5 g; K  G! k/ S1 p
    file,err := os.Open("file.txt")fmt.print(file)
    % i: n; J3 x1 w: [2 m3 M8 f
它输出 &{0xc082016240} 的原因是你正在打印文件描述符 ( *os.File)指针值,而不是文件内容。你可以获得文件内容READ从文件描述符中获取。
; o0 {" b  E5 p7 x在内存中读取所有文件内容(以字节为单位),ioutil.ReadAll
! l( N0 B# g- ^$ ]- T  A6 a. E
    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)}
    4 t: I/ ~; C6 v9 s5 @
但有时,如果文件很大,只读块可能会节省更多的内存:缓冲区的大小,所以你可以使用它io.Reader.Readfrom的实现*os.File
$ L' O* @9 w9 i9 @& }3 ~[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阅读您的文件:分隔符。! ]; \+ c& m3 A$ |" Z
默认情况下,扫描仪通过换行符推进标记(当然,你可以定制扫描仪如何标记你的文件,从这里学习bufio 测试)。6 e7 ]8 B3 l; }) q
[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]
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则