[問題] 讀txt檔中的陣列,想略過開頭的"["

看板C_and_CPP (C/C++)作者 (遊戲boy)時間11年前 (2015/04/24 17:48), 11年前編輯推噓3(3015)
留言18則, 9人參與, 最新討論串1/1
開發平台(Platform): C++ 問題(Question): 如標題,讀txt檔中的陣列存到陣列中 但一開始的"["第一個值連在一起,會讓我第一個讀的值變0 餵入的資料(Input): txt檔的內容如下 [108.684, 19.9082, 0.316327, 0.193878, 0.867347; 64.1389, 59.4167, 14.1111, 11.2222, 7.63889; 17.8065, 6.12345, 3.29032, 12.5161, 106.226] 預期的正確結果(Expected Output): 將所讀的值正確的設給陣列model儲存 108.684, 19.9082, 0.316327, 0.193878, 0.867347 64.1389, 59.4167, 14.1111, 11.2222, 7.63889 17.8065, 6.12345, 3.29032, 12.5161, 106.226 錯誤結果(Wrong Output): 矩陣中的其他元都正確,但就是第一元會變0 0, 19.9082, 0.316327, 0.193878, 0.867347 64.1389, 59.4167, 14.1111, 11.2222, 7.63889 17.8065, 6.12345, 3.29032, 12.5161, 106.226 程式碼(Code):(請善用置底文網頁, 記得排版) Mat model = Mat::zeros(keyt, 128, CV_32F); char opline[1000]; int col, row = 0; fp.open("abc.txt", ios::in); while (fp.getline(opline, 1000, ';')){ col = 0; char *p1 = strtok(op_line, ","); // 以","為分隔號分割字串, // 分割結果存入p1陣列 while (p1 != NULL) { model.at<float>(row, col) = atof(p1); // model矩陣存取讀值 col++; p1 = strtok(NULL, ","); // 類似"進到陣列下一個元素"的概念 } row++; } 補充說明(Supplement): 我對指標不太熟悉 不然這問題,應該可以用我用的strtok函式就能解決 不過這問題應該很多人都很常遇到 想問一下有沒有甚麼經典的漂亮解法? 先感謝各位大大了 <m(.)m> -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.25.105 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1429868904.A.961.html 似乎之前爬文爬得不夠詳細 最後加上 if (op_line2[0] == '[') for (int i = 0; i < 1000; i++) op_line2[i] = op_line2[i + 1]; 就達到我要的功能了 不過還是想看看有沒有更漂亮的方法@@

04/24 18:15, , 1F
都用 C++ 了何苦寫成這樣
04/24 18:15, 1F
sorryT.T 我coding超弱XDD 請教更簡潔的寫法~

04/24 20:39, , 2F
以下方法只適用這特例 , 比較 generial 還是要走字串分析
04/24 20:39, 2F

04/24 20:41, , 3F
atof(*p1) -> atof( *p1=='[' ? *p1 : *(p1+1) ) ;
04/24 20:41, 3F

04/24 20:43, , 4F
atof( p1) -> atof( *p1=='[' ? p1 : p1+1) ; 修正錯誤XD
04/24 20:43, 4F

04/24 20:46, , 5F
直接op_line2++不就結了 何苦整列抄一遍
04/24 20:46, 5F

04/24 21:08, , 6F
How about "strtok (str," ,[]\n")" ?
04/24 21:08, 6F

04/24 21:09, , 7F
sorry, str 改成 opline
04/24 21:09, 7F

04/24 21:10, , 8F
以及 strtok (NULL," ,[]\n")
04/24 21:10, 8F

04/24 21:13, , 9F
一開始讀檔不要讀[就好啦
04/24 21:13, 9F

04/24 21:57, , 10F
看你問題一行就馬上想到和MOON一樣的答案。
04/24 21:57, 10F

04/24 21:59, , 11F
可見這年頭大家對指標的理解還是不行
04/24 21:59, 11F

04/24 22:16, , 12F
要不要直接在 fp.open 的下一行加個 fp.get()
04/24 22:16, 12F

04/25 13:13, , 13F
strtok()的方法較好啦,誰知道[會跑到哪裡
04/25 13:13, 13F

04/25 13:15, , 14F
雖然這看起來是一個JSON []如果出現在裡面應該另做解釋
04/25 13:15, 14F

04/25 23:40, , 15F
@MOONRAKER 不是 JSON 啦, 都有分號了
04/25 23:40, 15F

04/26 00:36, , 16F
更居然有分號 X(
04/26 00:36, 16F

04/26 02:01, , 17F
又是逗號又是分號的好亂阿~
04/26 02:01, 17F
感謝各位不吝大方指教!!實在受益良多! 現在才知道原來strtok第二個輸出可以是多個字符 =.= 其實txt檔中是多個陣列輸入所得,如下列所示 (各陣列行數相同,列數不一定) [ 1.8463, 86.4531, 31.245, 648.8432, 12.479; 841.123, 97.1, 2.7971, 14, 55.6782; 11.756, 38.4786, 947.348, 61.207, 64.9301] [ 12.498, 648.108, 314.8219, 51,692, 37.6815; 77.314, 69.0214, 71.1, 36.78, 90.001; 321.028, 349.1, 4.308, 61.819, 66; 41.86., 14.9231, 20, 974.2, 34.947] 所以參考各位給的方法,我覺得最好&最簡單的解法應該是下面這樣? fp.open("abc.txt", ios::in); while (fp.getline(opline, 1000, '\n')){ col = 0; char *p1 = strtok(op_line, ",[];"); // 以","為分隔號分割字串, // 分割結果存入p1陣列 while (p1 != NULL) { model.at<float>(row, col) = atof(p1); // model矩陣存取讀值 col++; p1 = strtok(NULL, ","); // 類似"進到陣列下一個元素"的概念 } row++; } 不知道是否有理解錯誤@@ 有謬誤的話還請各位前輩指點 ※ 編輯: UCboy (140.112.25.105), 04/26/2015 14:56:50

04/28 00:21, , 18F
不要有中括弧吧? 那兩個不是不同的陣列?
04/28 00:21, 18F
文章代碼(AID): #1LEX5ebX (C_and_CPP)
文章代碼(AID): #1LEX5ebX (C_and_CPP)