完美解決go Fscanf 在讀取文件時出現的問題

先要明白Fscanf的工作原理

Fscanf在遇到\n才結束

遇到\r時就會把\r替換成0

這就有個問題,要註意自己的文本換行符是什麼,在Windows下就是\r\n,在Linux,Mac下就是\n,也就是說這裡有個坑,

代碼在Linux和Mac下讀取數據文件是正常的,在Windows下就會遇到各種行末尾有個0,網上辦法用什麼替換啊,用什麼自定義Scan函數啊,太麻煩瞭,直接使用自帶IDE將打開的數據文件集換行符改成LF(Linux,Mac換行符)就行瞭

如下圖Idea

文件右下角LF點擊就可以更換換行符

補充:go中的Fscanf讀到0的問題

今天在使用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

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。