关于*osFile.Read() 读取的问题

zhangsheng1992 · · 950 次点击
** 先贴代码 ** ``` package main import ( "fmt" "os" "log" "io" ) func main() { rf, err := os.Open("a.txt") //os.OpenFile("a.txt", os.O_RDWR, 0) if err != nil { log.Println("文件读取失败, 原因为: ", err) os.Exit(1) } defer rf.Close() chunks := make([]byte,10) buf := make([]byte, 10) // len(buf) = 10, cap(buf) = 10, 初始值为0 byte=unit8 0~255 for { n, err := rf.Read(buf) if err != nil && err != io.EOF { log.Println("读取失败, 原因为: ", err) os.Exit(1) }else if err == io.EOF { break } if n == 0 { break } chunks = append(chunks, buf[:n]...) } fmt.Println(string(chunks)) } ``` `func make(Type, size IntegerType) Type`这个函数是会指定默认初始值。但是, 你的问题是当slice的长度大于容量时, 此时将动态分配新的数组空间, 指向这个指针地址。 而新开辟的数组空间为当前slice的默认值。 1_2_3_4_5_ 当字节到达指定cap时, 开辟新空间 1_2_3_4_5_ 第二次赋值仅仅将6_7替换掉
#4
更多评论
没有再读一遍,只是上次读完残留的。第一次读五个数12345,下次还是这个buf,但是只读了两个数6和7,把buf里面的1和2给替换掉了,所以会出现67345。
#1
``` func main() { readFile, err := os.Open("a.txt") for { buf := make([]byte, 12) n, _ := readFile.Read(buf) if n == 0 { break } fmt.Println(string(buf), "读取子节:", n) } } 这样应该是满足你要求的。 ```
#2