2016-11-27 71 views
0

我試圖從多諾萬書上運行gopl.io/ch1 /dup3程序在Windows 7上使用版本1.7.3。split包含EOF?

當我運行下面的程序test.go時,我在最後得到一個空行。這是EOF嗎?我如何區分它與實際的空行?

package main 
import (
    "fmt" 
    "io/ioutil" 
    "os" 
    "strings" 
) 
func main() { 
    Counts := make(map[string]int) 
    for _, filename := range os.Args[1:] { 
    data, err := ioutil.ReadFile(filename) 
    if err != nil { 
     fmt.Fprintf(os.Stderr, "%s: %v\n", os.Args[0], err) 
     continue 
    } 
    for _, line := range strings.Split(string(data), "\r\n") { 
     counts[line]++ 
    } 
    } 
    for line, n := range counts { 
    if n > 1 { 
     fmt.Printf("%d\t%s\n", n, line) 
    } 
    } 
} 

與TEST.DAT文件:

Line number one 
Line number two 

命令:

> test.exe test.dat test.dat 

輸出是

2  Line number one 
2  Line number two 
2       <-- Here is the empty line. 

回答

1

如果您的文件以新行序列結束,拆分文件新行序列中的內容將會是r在一個無關的空字符串中產生。如果讀取最後行序列前發生EOF,那麼你沒有得到空字符串:

eofSlice := strings.Split("Hello\r\nWorld", "\r\n") 
extraSlice := strings.Split("Hello\r\nWorld\r\n", "\r\n") 

// [Hello World] 2 
fmt.Println(eofSlice, len(eofSlice)) 

// [Hello World ] 3 
fmt.Println(extraSlice, len(extraSlice)) 

Playground link

+0

文件完全一樣顯示在問題恰好與2號線,在沒有額外的行底部,就像你的eofSlice字符串一樣。 – user2443447

+0

@ user2443447檢查完'err'後,做了'fmt.Fprintln(os.Stderr,data [len(data)-1])'print'10'?如果是這樣,那麼你有一組字節像'extraSlice',而不是'eofSlice'。 –

+0

如果你願意,你可以[看另一個遊樂場的例子](https://play.golang.org/p/xCv0XN6gv4)。它使用與你的問題幾乎相同的代碼,除了文件被替換爲字符串。 –