go中的Fscanf读到0的问题

本文探讨了使用Fscanf在Windows环境下读取矩阵时遇到的换行符问题,导致每行末尾多读一个0。分析了问题原因,并提供了三种解决方案,包括修改IDE格式、读取并忽略额外的0以及使用Fscan替代。

今天在使用Fscanf读矩阵的时候遇到了一个问题,发现每次遇到换行,就多读一个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)
		for j := range maze[i] {
			fmt.Fscanf(file,"%d",&maze[i][j])
		}
	}
	return maze
}

分析得出这是由于windows下的格式导致的,在windows下的换行符是\r\n,所以遇到\r会读一个0进去,在linux下换行符只有\n

解决方法1

直接通过修改ide的格式即可,在goland的下方修改:

在这里插入图片描述
改成LF即为linux,这种方法我试了没成功,不知道是不是电脑的原因,可以先试一下这种方法

解决方法2

如果是不能避免,那就把这个0读出来,然后扔掉即可,可以在每行后面,多根一句话:

		fmt.Fscanf(file,"%d")
解决方法3

使用方法

		fmt.Fscan(file,&maze[i][j])

不规定格式的情况下是不会出现多读0

`fscanf`函数读取的值全为0,可能有以下几种原因及相应的解决办法: ### 格式不匹配 若文件中的数据格式与`fscanf`的格式字符串不匹配,`fscanf`可能无法正确解析数据,从而将变量初始化为0。 ```c #include <stdio.h> int main() { FILE *fp; int num; fp = fopen("test.txt", "r"); if (fp != NULL) { // 假设文件内容是字符串 "abc",而这里用 %d 读取 if (fscanf(fp, "%d", &num) != 1) { printf("Reading error: format mismatch\n"); } else { printf("Read number: %d\n", num); } fclose(fp); } return 0; } ``` 解决办法:确保`fscanf`的格式字符串与文件中的数据格式一致。若文件包含字符串,使用`%s`;若为整数,使用`%d`;若为浮点数,使用`%f`等。 ### 文件内容为空 若文件为空,`fscanf`无法读取有效数据,变量会保持初始值0。 ```c #include <stdio.h> int main() { FILE *fp; int num = 0; fp = fopen("empty.txt", "r"); if (fp != NULL) { if (fscanf(fp, "%d", &num) != 1) { printf("Reading error: file is empty\n"); } else { printf("Read number: %d\n", num); } fclose(fp); } return 0; } ``` 解决办法:检查文件是否有内容,可使用`fseek`和`ftell`函数判断文件大小。 ```c #include <stdio.h> int main() { FILE *fp; fp = fopen("test.txt", "r"); if (fp != NULL) { fseek(fp, 0, SEEK_END); long size = ftell(fp); if (size == 0) { printf("File is empty.\n"); } else { // 进行读取操作 } fclose(fp); } return 0; } ``` ### 变量未正确初始化 若变量在使用前未初始化,可能包含随机值。若读取失败,变量可能保持初始值0。 ```c #include <stdio.h> int main() { FILE *fp; int num = 0; // 初始化为0 fp = fopen("test.txt", "r"); if (fp != NULL) { if (fscanf(fp, "%d", &num) != 1) { printf("Reading error\n"); } else { printf("Read number: %d\n", num); } fclose(fp); } return 0; } ``` 解决办法:确保变量在使用前正确初始化,或在读取失败时进行错误处理。 ### 文件打开失败 若文件打开失败,`fscanf`无法读取数据,变量会保持初始值0。 ```c #include <stdio.h> int main() { FILE *fp; int num = 0; fp = fopen("nonexistent.txt", "r"); if (fp == NULL) { perror("Failed to open file"); } else { if (fscanf(fp, "%d", &num) != 1) { printf("Reading error\n"); } else { printf("Read number: %d\n", num); } fclose(fp); } return 0; } ``` 解决办法:检查文件路径是否正确,文件是否存在,以及是否有足够的权限打开文件。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值