2013-11-24 16 views
0

所以我有以下測試去代碼,它被設計爲通過stdin從二進制文件讀取,並將讀取的數據發送到一個通道(在那裏它將被處理進一步)。在我在這裏給出的版本中,它只能讀取標準輸入的前兩個值,儘管就顯示問題而言這沒什麼問題。從標準輸入接收二進制數據,發送到去通道

package main 

import (
    "fmt" 
    "io" 
    "os" 
) 

func input(dc chan []byte) { 
    data := make([]byte, 2) 
    var err error 
    var n int 
    for err != io.EOF { 
     n, err = os.Stdin.Read(data) 
     if n > 0 { 
      dc <- data[0:n] 
     } 
    } 
} 

func main() { 
    dc := make(chan []byte, 1) 
    go input(dc) 
    fmt.Println(<-dc) 
} 

爲了測試它,我第一次建立它使用去構建,然後用我使用目前測試的命令 -

./inputtest < data.bin 

數據發送數據給它創建只是隨機二進制數據使用openssl命令。

我遇到的問題是它錯過了Stdin的第一個值,只給出了第二個和更大的值。我認爲這是關於頻道的,因爲刪除頻道的同一個腳本會生成正確的數據。有沒有人遇到過這個?例如,我在運行此命令 -

./inputtest < data.bin 
[36 181] 

的時候而我應該是getting-

./inputtest < data.bin 
[72 218] 

得到下面的輸出(二進制數據是在這兩種情況下是相同的。)

回答

5

你在每次讀取時重寫緩衝區,並且您有一個通道緩衝區,所以每當通道有空間時就會丟失數據。

嘗試是這樣的(未測試,寫在平板電腦等):

func input(dc chan []byte) { 
    defer close(dc) 
    for { 
     data := make([]byte, 2) 
     n, err := os.Stdin.Read(data) 
     if n > 0 { 
      dc <- data[0:n] 
     } 
    } 
} 
+0

這一工程!謝謝! – user3027597

相關問題