我正在尝试编写一个函数来继续从缓冲读取器读取数据,直到我遇到某个字符串,然后停止读取并返回在该字符串之前读取的所有内容。
换句话说,我想做与 reader.ReadString()
相同的事情,除了采用字符串而不是单个字节。
例如:
mydata, err := reader.ReadString("\r\n.\r\n") //obviously will not compile
我该怎么做?
提前致谢
三毛
修正案 1:之前的尝试
这是我之前的尝试;它写得不好而且不起作用,但希望它能展示我正在尝试做的事情。
func readDotData(reader *bufio.Reader)(string, error){
delims := []byte{ '\r', '\n', '.', '\r', '\n'}
curpos := 0
var buffer []byte
for {
curpos = 0
data, err := reader.ReadSlice(delims[0])
if err!=nil{ return "", err }
buffer = append(buffer, data...)
for {
curpos++
b, err := reader.ReadByte()
if err!=nil{ return "", err }
if b!=delims[curpos]{
for curpos >= 0{
buffer = append(buffer, delims[curpos])
curpos--
}
break
}
if curpos == len(delims){
return string(buffer[len(buffer)-1:]), nil
}
}
}
panic("unreachable")
}
最佳答案
package main
import (
"bytes"
"fmt"
"log"
)
type reader interface {
ReadString(delim byte) (line string, err error)
}
func read(r reader, delim []byte) (line []byte, err error) {
for {
s := ""
s, err = r.ReadString(delim[len(delim)-1])
if err != nil {
return
}
line = append(line, []byte(s)...)
if bytes.HasSuffix(line, delim) {
return line[:len(line)-len(delim)], nil
}
}
}
func main() {
src := bytes.NewBufferString("123deli456elim789delimABCdelimDEF")
for {
b, err := read(src, []byte("delim"))
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q\n", b)
}
}
输出:
"123deli456elim789"
"ABC"
2009/11/10 23:00:00 EOF
关于string - 从阅读器读取直到到达一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17916912/