2017-09-19 5 views
1

ReadString()は改行に続くバイトを破棄しますか?私は次のように、ネットワーク接続から読み取るしようとしています

func getIn(conn net.Conn){ 
    for{ 
     in, err := bufio.NewReader(conn).ReadString('\n') 
     if err!=nil{ 
      fmt.Printf(err.Error()) 
     } 
     fmt.Printf("[%s]", in) 
    } 
} 

入力の流れは以下のパターンであり、その接続に送信されている:

メッセージ1の\ nはメッセージ2 \ n個message3の\ n個のmessage4の\ n個のmessage5の\ nを

等...

私は私の関数はMESSAをスキップすることに気づきました例えば出力GES、,:

メッセージ1 \ nmessage2 \ nmessage4 \ nはmessage5 \ nは

このメソッドをReadString BUFIOが着信バッファに改行文字があるたびに破棄することを考えるように私をリード遭遇した。読書の瞬間に

メッセージ1の\のnmess

:バッファはで構成されて言います。次に、メッセージ1が読み込まれ、残りの部分が読み取られ、残りの部分が読み取られます。messは破棄されます。そして、次の入力がAGE2する必要がありますが、実際にそれがmessage3あるので、これは完全に、どちらかの意味がありません。

net.Conn.Read()という別の関数を使用しましたが、実際には入力の一部をスキップしませんが、私の側ではより多くの文字列解析が必要です。私はReadString()関数をどのように動作させることができますか?

+0

はループの外ではなく、反復ごとに一度リーダーを作成してみてください。 'ReadString'は' \ n'を超えて読んでいますが、あなたは新しい読者を創造し続けるので、バッファリングされたデータは失われます。 –

+0

ありがとうございます。それが確かに解決策でした。 – wit221

答えて

2

ReadString()はデータを破棄しない、それはすなわち、bufio.Readerオブジェクトに緩衝まだ.:

conn := bytes.NewBufferString("message1\n message2\n message3\n ") 
reader := bufio.NewReader(conn) 

in, _ := reader.ReadString('\n')     // "message1\n" 
fmt.Println(strconv.Quote(in)) 
in, _ = reader.ReadString('\n')     // "message2\n" 
fmt.Println(strconv.Quote(in)) 
fmt.Println(strconv.Quote(conn.String()))  // "" 

すべてのデータにもかかわらずconnバッファから排出されたことを注意、それはまだ後続reader.ReadString()コールを介してアクセス可能です。ただし、各繰り返しでリーダーオブジェクトを破棄すると、すべてのデータが失われます。

あなたはまだ第二のループにあなたの読者を持っていますので、あなたは、ループの外バッファリングの読者を作成する必要があります。

reader := bufio.NewReader(conn) 
for { 
    in, err := reader.ReadString('\n') 
    ... 
+0

ありがとうございます。 NewReader関数の名前は、それが何をしているのか、なぜそれがあるのか​​のヒントを私に与えているはずです... – wit221

関連する問題