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

一,问题:

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

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

二,问题代码:

1,输入文件maze.in:


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()
}
}

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


四,分析错误:

1.改变输入:

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


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

2.测试输出:


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()函数:

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

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

这里就不做演示。

六,求解更好解决方案:

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

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

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

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

go学习之文件读取问题(需更新)的更多相关文章

  1. Java学习-019-Properties 文件读取实例源代码

    在这几天的学习过程中,有开发的朋友告知我,每个编程语言基本都有相应的配置文件支持类,像 Python 编程语言中支持的 ini 文件及其对应的配置文件读取类 ConfigParse,通过这个类,用户可 ...

  2. Java学习-016-CSV 文件读取实例源代码

    上文(CSV文件写入)讲述了日常自动化测试过程中将测试数据写入 CSV 文件的源码,此文主要讲述如何从 CSV 文件获取测试过程中所需的参数化数据.敬请各位小主参阅,若有不足之处,敬请大神指正,不胜感 ...

  3. Java学习-017-EXCEL 文件读取实例源代码

    众所周知,EXCEL 也是软件测试开发过程中,常用的数据文件导入导出时的类型文件之一,此文主要讲述如何通过 EXCEL 文件中 Sheet 的索引(index)或者 Sheet 名称获取文件中对应 S ...

  4. 2019-10-29:渗透测试,基础学习,sqlmap文件读取,写入,dnslog盲注作用,mssql手工注入,笔记

    sqlmap参数--file-read,从数据库服务器中读取文件--file-write,--file-dest,把文件上传到数据库服务器中 dnslog平台的学习和它在盲注中的应用1,判断注入点2, ...

  5. 风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞

    风炫安全web安全学习第三十五节课 文件下载和文件读取漏洞 0x03 任意文件下载漏洞 一些网站由于业务需求,往往需要提供文件下载功能,但若对用户下载的文件不做限制,则恶意用户就能够下载任意敏感文件, ...

  6. 深度学习_1_Tensorflow_2_数据_文件读取

    tensorflow 数据读取 队列和线程 文件读取, 图片处理 问题:大文件读取,读取速度, 在tensorflow中真正的多线程 子线程读取数据 向队列放数据(如每次100个),主线程学习,不用全 ...

  7. H5学习系列之文件读取API--本文转自http://blog.csdn.net/jackfrued/article/details/8967667

    HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简 ...

  8. Java学习-013-文本文件读取实例源代码(两种数据返回格式)

    此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代 ...

  9. 关于php文件读取的一些学习记录

    初学PHP的时候使用了一些文件读取API,但是没有真正弄清楚各API的区别以及差异,于是找了一篇学习了一下,贴在这里,引用自IBM社区的一篇文章, 整体整理测试如下 <?php /** * Cr ...

随机推荐

  1. Ajax学习---Ajax基础学习 180128

    AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互,传输的数据为 ...

  2. [Codeup 25481] swan

    莫名其妙还找到了另一个铟炔锶烃的OJ : Codeup墓地 25481: swan 时间限制: 1 Sec  内存限制: 128 MB献花: 86  解决: 13[献花][花圈][TK题库] 题目描述 ...

  3. webpack环境搭建开发环境,JavaScript面向对象的详解,UML类图的使用

    PS:因为所有的设计模式都是基于面向对象来完成的,所以在讲解设计模式之前先来过一下面向对象都有哪些知识点 搭建开发环境 初始化npm环境 下载安装nodejs安装即可,nodejs自带npm管理包,然 ...

  4. 一篇文章详解iOS之AutoResizing、AutoLayout、sizeClass来龙去脉

    前言 iPhone自诞生以来,随着其屏幕尺寸不断的多样化,屏幕适配的技术一直在发展更新.目前,iOS系统版本已经更新到9.3,XCode的最新版本已经是7.3,仅iPhone历史产品的尺寸就已经有4种 ...

  5. POJ1375 Intervals

    嘟嘟嘟 题意简述:给出一个光源\((x_0, y_0)\),和一些圆,求投影区间. 这道题其实就是求经过\((x_0, y_0)\))的圆的切线. 刚开始我想到了一个用向量旋转的方法,但是写起来特别麻 ...

  6. 【nodejs】学习笔记

    学习链接:http://www.cnblogs.com/zhongweiv/p/nodejs_environment.html (一)简介及环境安装 Node.js是让Javascript脱离浏览器运 ...

  7. 2、Android-UI(RecyclerView)

    2.6.滚动控件-RecylerView ListView虽然使用的效果很好但是也是有缺点的 不使用一些技巧来提升它的运行效率,性能就非常差 扩展性也不是很好 只能实现数据的纵向滚动效果 实现横向滚动 ...

  8. 新闻cms管理系统(三) ------菜单管理

    1.前期准备工作 (1)模板介绍 添加菜单的模板页面 菜单管理首页: 添加菜单页面: (2)公共类引入介绍 公共函数文件的引入(位置: Application/Admin/Controller/Com ...

  9. consul搭建(初步)

    http://www.cnblogs.com/java-zhao/p/5375132.html https://blog.csdn.net/u010246789/article/details/517 ...

  10. SDOI2018一轮NOI培训 题目整理

    \(qwq\)首先,这些题对于我而言--类似于\(emmm\)洪水猛兽 \(\mathcal{Day \ \ 1}\) T1 \(\mathcal{\color{red}{Description}}\ ...