博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
go学习之文件读取问题(需更新)
阅读量:4350 次
发布时间:2019-06-07

本文共 2855 字,大约阅读时间需要 9 分钟。

go学习之文件读取问题(需更新)

 

一,问题:

今天做一个GO广度迷宫问题时,出现了一个奇怪的问题。

就是通过fmt.Fscanf()读取文件时,每行末尾多出一个0.

 

 

二,问题代码:

1,输入文件maze.in:

6 50 1 0 0 00 0 0 1 00 1 0 1 01 1 1 0 00 1 0 0 10 1 0 0 0

PS:第一行表示输入文件的row和col,下面的0表示可以通过,1表示无法通过。

 

2.读取文件函数readMaze:

func readMaze(filename string) [][]int {    file, err := os.Open(filename)    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] {            fmt.Fscanf(file, "%d", &maze[i][j])        }    }    return maze}

PS:这段代码时从网上ccoume那里剽过来的。

 

3.主函数main(只用于测试读取功能):

func main() {    maze := readMaze("maze/maze.in")    for _, row := range maze {        for _, val := range row {            fmt.Printf("%d ", val)        }        fmt.Println()    }}

 

 

三,问题代码执行的输出:

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

 

 

四,分析错误:

1.改变输入:

因为输入文件全是0与1,我们无法判断问题出在哪里,我就将输入文件改为下列方式:

6 51 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 2021 22 23 24 2526 27 28 29 30

同样是6行,5列,但是内容却是从1到30

 

2.测试输出:

0 1 2 3 4 5 0 6 7 8 9 10 0 11 12 13 14 15 0 16 17 18 19 20 0 21 22 23 24 25

 

 

3.分析问题:

我们可以看到在原来每次换行前都多了一个0,但是考虑到输入文件还有第一行的6和5,所以应该是每行换行后多了一个0.

并且,每个数字都有按顺序输入。代码中的file是连续的。而输出文件符合我们规定的数组形式。

所以代码本身没有错误。而只是原本输入文件的换行都有一个0,而fmt.Fscanf并没有处理。

 

 

五,解决方案:

1.改变输入文件:

可以通过将输入文件中所涉及到的换行都取消掉。这样就可以不用修改代码了。而且也可以确保在处理类似文件时,代码依旧不需要修改。

 

2.修改读取函数:

很多时候,我们无法修改输入文件,那么我们可以修改自己的读取函数readMaze()。

既然,fmt.Fscanf()无法跳过0,那我们就多读取一下0,但不输入到我们的读取结果数组中。

代码如下:

func readMaze(filename string) [][]int {    file, err := os.Open(filename)    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)        fmt.Fscanf(file, "%d")        //用以解决换行带来的0值问题。希望以后可以找到一个更好的解决方案。        for j := range maze[i] {            fmt.Fscanf(file, "%d", &maze[i][j])        }    }    return maze}

 

PS:按照代码的可读性以及逻辑来说,我应该在每次换行后添加

fmt.Fscanf(file, "%d")

即,应该写成如下代码:

func readMaze(filename string) [][]int {    file, err := os.Open(filename)    if err != nil {        panic(err)    }    var row, col int    fmt.Fscanf(file, "%d %d", &row, &col)    fmt.Fscanf(file, "%d")    maze := make([][]int, row)    for i := range maze {        maze[i] = make([]int, col)        for j := range maze[i] {            fmt.Fscanf(file, "%d", &maze[i][j])        }        fmt.Fscanf(file, "%d")    }    return maze}

PS:这样更为友好,但我只是写一个小的广度迷宫读取,就偷懒了。。。

当然,前面读取5与6那两个fmt.Fsacnf是可以合起来,合为: 

fmt.Fscanf(file, "%d %d ", &row, &col)//就是多了一个空格

 

 

3.自定义扩展fmt.Fscanf()函数:

之前的方法还是太有局限性了。不可能每次读取类似文件,我都加一句吧。

所以为了一劳永逸,完全可以写一个自定义的扩展函数。解决换行问题。

这里就不做演示。

 

 

六,求解更好解决方案:

这样的问题,肯定已经有了更为成熟的解决方案,只是作为小白的我没有找到,我在这里只是提供一个我自己想到的解决方法。

当然啦,更多的是一个找到问题,解决问题的路子吧。

如果有人知道更好的解决方案,可以告诉我。非常感谢。

另外,如果之后,我找到了更好的解决方法,我也会来更新的。

 

转载于:https://www.cnblogs.com/Tiancheng-Duan/p/9015235.html

你可能感兴趣的文章
Linux的用户态和内核态
查看>>
JavaScript原生错误及检测
查看>>
(原创) cocos2d-x 3.0+ lua 学习和工作(4) : 公共函数(3): 深度克隆clone()
查看>>
为什么写作
查看>>
整数子数组求最大和添加验证
查看>>
使用kubeadm安装Kubernetes
查看>>
Principal Component Analysis 主元分析
查看>>
JDBC原生态代码
查看>>
韩版可爱小碎花创意家居收纳挂袋
查看>>
计算机基础之硬件
查看>>
python操作mysql ------- SqlAchemy正传
查看>>
如何使用 JSP JSTL 显示/制作树(tree) 菜单
查看>>
12.5号
查看>>
lintcode-medium-Binary Tree Zigzag Level Order Traversal
查看>>
logrotate日志切割
查看>>
POJ-3253 Fence Repair 贪心
查看>>
Arraylist集合遍历输出
查看>>
java中的选择结构与循环结构
查看>>
无法将类型“ASP.login_aspx”转换为“System.Web.UI.WebControls.Login”
查看>>
[cocos2dx] lua注册回调到c++
查看>>