我使用以下代码在Go中读取文件:
spoon , err := ioutil.ReadFile(os.Args[1])
if err!=nil {
panic ("File reading error")
}
Run Code Online (Sandbox Code Playgroud)
现在我检查我选择的每个字节是什么字符.例如:
spoon[i]==' ' //for checking space
Run Code Online (Sandbox Code Playgroud)
同样我读了整个文件(我知道可能还有其他方法可以阅读)但保持这种方式完好无损,我怎么知道我已达到文件的EOF而我应该再停止阅读?
请不要建议找到长度spoon并开始循环.我想要找到EOF的确定镜头方式.
pet*_*rSO 20
使用io.EOF来测试档案结尾.例如,要计算文件中的空格:
package main
import (
"fmt"
"io"
"os"
)
func main() {
if len(os.Args) <= 1 {
fmt.Println("Missing file name argument")
return
}
f, err := os.Open(os.Args[1])
if err != nil {
fmt.Println(err)
return
}
defer f.Close()
data := make([]byte, 100)
spaces := 0
for {
data = data[:cap(data)]
n, err := f.Read(data)
if err != nil {
if err == io.EOF {
break
}
fmt.Println(err)
return
}
data = data[:n]
for _, b := range data {
if b == ' ' {
spaces++
}
}
}
fmt.Println(spaces)
}
Run Code Online (Sandbox Code Playgroud)
MoH*_*oHo 13
这是您需要查找的内容来了解文件结束符(EOF)
if err != nil {
if errors.Is(err, io.EOF) { // prefered way by GoLang doc
fmt.Println("Reading file finished...")
}
break
}
Run Code Online (Sandbox Code Playgroud)
ioutil.ReadFile()将文件的全部内容读入字节切片.你不需要关心EOF.EOF是一次读取一个文件块时所需的构造.当您一次读取一个块时,您需要知道哪个块已到达文件的末尾.
返回的字节切片的长度ioutil.ReadFile()就是您所需要的.
data := ioutil.ReadFile(os.Args[1])
// Do we need to know the data size?
slice_size := len(data)
// Do we need to look at each byte?
for _,byte := range data {
// do something with each byte
}
Run Code Online (Sandbox Code Playgroud)
切片没有文件结尾的概念。返回的切片ioutil.ReadFile具有特定的长度,该长度反映了从中读取的文件的大小。一个常见的习惯用法,但在这种情况下只是可能使用的一种,是对切片进行范围调整,有效地“消耗”最初位于文件中的所有字节:
for i, b := range spoon {
// At index 'i' is byte 'b'
// At file's offset 'i', 'b' was read
... do something useful here
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25034 次 |
| 最近记录: |