Golang 中 Fscanf读取二维数组的坑

二维数组

6 5
0 1 0 0 0
0 0 0 1 0
0 1 0 1 0
1 1 1 0 0
0 1 0 0 1
0 1 0 0 0

问题代码

func TestReadFile(t *testing.T) {
    file, err := os.Open("migong.in")
    if err != nil {
        panic(err)
    }

    var row, col int
    fmt.Fscanf(file, "%d %d", &row, &col)

    maze := make([][]int, row)
    for i := range maze {
        maze[i] = make([]int, col)
        for j := range maze[i] {
            _, err := fmt.Fscanf(file, "%d", &maze[i][j])
            if err != nil {
                t.Error(err)
            }
        }
    }
    fmt.Println(maze)
}

输出结果

[[0 0 1 0 0] [0 0 0 0 0] [1 0 0 0 1] [0 1 0 0 1] [1 1 0 0 0] [0 1 0 0 1]]
0 0 1 0 0 
0 0 0 0 0 
1 0 0 0 1 
0 1 0 0 1 
1 1 0 0 0 
0 1 0 0 1 

问题原因

此段代码在windows中会出现问题多读了一个0的情况,在mac os中是不会有问题

原因是因为Fscanf函数遇到'\n'时会结束,但windows的文件类型一般时CRLF(即'\r\n'),而mac os现在一般是LF(即'\n'),所以读到'\r'时会多读一个0。

解决办法

  • 在每句行尾加入 读出'\r'但是不存入
    for i := range maze {
        maze[i] = make([]int, col)
        fmt.Fscanf(file, "%d") // 读出'\r'但是不存入
        for j := range maze[i] {
            _, err := fmt.Fscanf(file, "%d", &maze[i][j])
            if err != nil {
                t.Error(err)
            }
        }
    }
  • 切换文本换行类型,如每个ide的右下角都一个会有行分隔符切换 可以点击CRLF进行切换成LF

版权声明:
作者:Ne-21
链接:https://blog.gocos.cn/archives/281.html
来源:云淡风轻
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
Golang 中 Fscanf读取二维数组的坑
二维数组 6 5 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 1 0 0 0 问题代码 func TestReadFile(t *testing.T) { file, err := os.Open("m……
<<上一篇
下一篇>>