2012-03-03 80 views
1

這似乎是正確的,但它扼殺在換行。 這樣做的最好方法是什麼?哪一掃描用於讀取字符串中的浮點數?

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    var z float64 
    var a []float64 
    // \n gives an error for Fscanf 
    s := "3.25 -12.6 33.7 \n 3.47" 
    in := strings.NewReader(s) 
    for { 
     n, err := fmt.Fscanf(in, "%f", &z) 
     fmt.Println("n", n) 
     if err != nil { 
      break 
     } 
     a = append(a, z) 
    } 
    fmt.Println(a) 
} 

輸出:

n 1 
n 1 
n 1 
n 0 
[3.25 -12.6 33.7] 

更新:

見從下面@Atom答案。如果錯誤是EOF,我發現了另一種方法,否則就忽略它。我知道這只是一種黑客攻擊,但我控制了源代碼。

_, err := fmt.Fscanf(in, "%f", &z) 
    if err == os.EOF { break } 
    if err != nil { continue } 

回答

5

如果您解析浮動,您可以使用fmt.Fscan(r io.Reader, a ...interface{})代替fmt.Fscanf(r io.Reader, format string, a ...interface{})

var z float64 
... 
n, err := fmt.Fscan(in, &z) 

fmt.Fscanfmt.Fscanf之間的區別是,在fmt.Fscan換行的情況下算作空間。後一個函數(使用格式字符串)不會將換行符視爲空格,並且要求輸入中的換行符與格式字符串中的換行符相匹配。

帶格式字符串的函數可以更好地控制輸入形式,例如當您需要掃描%5f%10s時。在這種情況下,如果輸入包含換行符並且它實現了接口io.RuneScanner,則可以使用方法ReadRune來查看下一個字符,如果不是空格或換行符,則可以使用UnreadRune進行未讀取。

+0

這很尷尬。我在文檔中看到了這個函數,但不知道要做什麼...... interface {}。然後我找到了一個例子來複制Fscanf和&z作爲參數,我沒有想到回到Fscan。但是,我仍然不知道簽名的功能是什麼。還沒有發現任何可以解釋它的東西。 – telliott99 2012-03-03 22:00:45

+1

包'fmt'的文檔正在解釋'a ... interface {}',其中包含以下語句:「所有要掃描的參數必須是指向基本類型或Scanner接口實現的指針」。 – 2012-03-04 12:29:46

2

如果輸入只是一堆由每行空格分隔的彩車行,它可能更容易只是閱讀從文件一次一行,在該行運行的sscanf(假設每條線上的浮線數量是固定的)。但是這裏有一些在你的例子中有效的方法---可能有辦法使它更有效率。只有

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    var z float64 
    var a []float64 
    // \n gives an error for Fscanf 
    s := "3.25 -12.6 33.7 \n 3.47" 
    for _, line := range strings.Split(s, "\n") { 
     in := strings.NewReader(line) 
     for { 
      n, err := fmt.Fscanf(in, "%f", &z) 
      fmt.Println("n", n) 
      if err != nil { 
       fmt.Printf("ERROR: %v\n", err) 
       break 
      } 
      a = append(a, z) 
     } 
    } 
    fmt.Println(a) 
} 
+0

謝謝。我知道我可以先分手。希望更深入的瞭解。同時,我可以通過「如果錯誤== os.EOF {break}」然後「如果err!= nil {continue}」來使它工作,但它看起來像一個黑客。不確定哪個錯誤對應於「意外的換行符」。 – telliott99 2012-03-03 18:32:20