5

特定の文字列に到達するまでバッファリングされたリーダーから読み取りを続け、読み取りを停止してその文字列の前に読み取ったすべてを返す関数を作成しようとしています。

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")
}
4

4 に答える 4

11
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
于 2013-07-29T08:23:25.830 に答える
3

http://play.golang.org/p/BpA5pOc-Rn

package main

import (
    "bytes"
    "fmt"
)

func main() {
    b := bytes.NewBuffer([]byte("Hello, playground!\r\n.\r\nIrrelevant trailer."))
    c := make([]byte, 0, b.Len())
    for {
        p := b.Bytes()
        if bytes.Equal(p[:5], []byte("\r\n.\r\n")) {
            fmt.Println(string(c))
            return
        }
        c = append(c, b.Next(1)...)

    }
}
于 2013-07-29T08:42:50.310 に答える