1
0
mirror of https://github.com/golang/go synced 2024-11-22 04:24:39 -07:00

fmt.Fscanf: don't read past newline

Makes interactive uses work line-by-line.
Fixes #3481.

R=golang-dev, bradfitz, r
CC=golang-dev
https://golang.org/cl/6297075
This commit is contained in:
Rob Pike 2012-06-11 17:52:09 -04:00
parent 49d6e49087
commit 2a0fdf6ea0
2 changed files with 29 additions and 1 deletions

View File

@ -1090,7 +1090,8 @@ func (s *ss) advance(format string) (i int) {
// There was space in the format, so there should be space (EOF)
// in the input.
inputc := s.getRune()
if inputc == eof {
if inputc == eof || inputc == '\n' {
// If we've reached a newline, stop now; don't read ahead.
return
}
if !isSpace(inputc) {

View File

@ -810,6 +810,33 @@ func TestMultiLine(t *testing.T) {
}
}
// simpleReader is a strings.Reader that implements only Read, not ReadRune.
// Good for testing readahead.
type simpleReader struct {
sr *strings.Reader
}
func (s *simpleReader) Read(b []byte) (n int, err error) {
return s.sr.Read(b)
}
// Test that Fscanf does not read past newline. Issue 3481.
func TestLineByLineFscanf(t *testing.T) {
r := &simpleReader{strings.NewReader("1\n2\n")}
var i, j int
n, err := Fscanf(r, "%v\n", &i)
if n != 1 || err != nil {
t.Fatalf("first read: %d %q", n, err)
}
n, err = Fscanf(r, "%v\n", &j)
if n != 1 || err != nil {
t.Fatalf("second read: %d %q", n, err)
}
if i != 1 || j != 2 {
t.Errorf("wrong values; wanted 1 2 got %d %d", i, j)
}
}
// RecursiveInt accepts a string matching %d.%d.%d....
// and parses it into a linked list.
// It allows us to benchmark recursive descent style scanners.