[問題] 讀檔做數字運算(C++)

看板C_and_CPP作者 (滎鶄)時間15年前 (2010/10/11 12:37), 編輯推噓7(7032)
留言39則, 5人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 用動態記憶體產生二維陣列,把數字讀進去並運算。 檔案類似: 1123.4566,375.11,18555.3 121.32,555.55,111 但是現在遇到逗號都會變成亂碼.. 希望得到的正確結果: 我希望能變成ptr[0][0]=1123.4566 , ptr[0][1]=375.11 。 程式跑出來的錯誤結果: 第一個陣列可以正常讀。 ptr[0][0]=1123.4566,但是遇到逗號','之後就亂碼了.. 雖然把逗號全部換成空白會對,但是資料檔裡面規定用逗號分隔.. 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) DEV C++ 有問題的code: (請善用置底文標色功能) double *ptr; ptr=new double[30]; cout.precision(9); ifstream fin; fin.open("Hw02_01.txt"); if(!fin) cout<<"讀取檔案失敗。"; //char ch; for (int i = 0; i < 7; i++) { for (int k = 0; k < 4; k++) { //fin.get(ch); // *(ptr+i*4+k)=ch; //cin.getline(fin,15); fin>>*(ptr+i*4+k); // if(fin==','); } } for (int i = 0; i < 7; i++) { for (int k = 0; k < 4; k++) { cout<<*(ptr+i*4+k); }} cout<<*(ptr+0)<<endl<<*(ptr+1); 補充說明: 有些註解的地方是我爬文或是換個方式寫的,但那反而錯更多... 我也有找到fscanf()但那好像是C語言的語法,沒教過。 如果可以,我希望能使用C++解題。 另外我發現了個問題,如果我程式沒寫cout.precision(9),程式好像只會讀到6個數字。 請問,這是為什麼?(當初為了這個也卡好久) 兩個問題,煩請各位! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.171.85.198

10/11 12:40, , 1F
不是有用到new就叫C++...
10/11 12:40, 1F
我上的課程、課本、老師教的都是寫C++.. 我只是想說fscanf()沒教過,教的是檔案>>變數(用串流符號)與cout。 可能有哪邊文意表達不清楚,抱歉!

10/11 12:42, , 2F
string + replace + stringstream + istream_iterator
10/11 12:42, 2F

10/11 12:43, , 3F
+ vector, 連記憶體配置都不用你做
10/11 12:43, 3F
抱歉,上面那段我看不懂。 我的目的只是用動態記憶體表示一個二維陣列而已!

10/11 12:45, , 4F
另外你會亂碼的原因是因為預期讀入double結果讀到逗號
10/11 12:45, 4F

10/11 12:46, , 5F
錯誤旗標升起, 之後的讀取動作都不算, 你看到的只是他
10/11 12:46, 5F

10/11 12:46, , 6F
原本的垃圾值
10/11 12:46, 6F
那我應該使用char嗎? 先讀成字元在轉成數字? 那請問要怎麼讀到逗號就把陣列+1呢? while(fin==','); 這樣好像也怪怪的。 麻煩各位,感恩。 ※ 編輯: j16598231 來自: 118.171.85.198 (10/11 19:58)

10/11 20:34, , 7F

10/11 20:35, , 8F
看一下scanf()和fscanf() 和其他常用的IO函式
10/11 20:35, 8F

10/11 22:10, , 9F
我關鍵字都打那麼多了...你確定你的行列都已知的話就
10/11 22:10, 9F

10/11 22:11, , 10F
用靜態陣列就好了啊, 動態比較容易搞炸掉, 在你很熟練
10/11 22:11, 10F

10/11 22:11, , 11F
之前還是用STL容器來做就好, 存取的語法也可以一樣
10/11 22:11, 11F

10/11 22:45, , 12F
而且沒教過就可以不會的話, 你可以別學了...
10/11 22:45, 12F

10/11 23:09, , 13F
老師也沒教過我用PTT問問題ㄟ
10/11 23:09, 13F
感謝上面各位的回文。 平常寫程式我有問題都是去C++學習筆記網站看,因為那裏沒寫到 fscanf()語法,我就自己認定fscanf()是C語言的寫法,有這種以 管窺天的想法真的很抱歉!也感謝上面各位不計較的回答我。 至於使用動態記憶體做是作業規定的... 目前正在嘗試以fscanf()語法寫,但碰到了些問題。 開檔的方式好像要改掉? double *ptr; ptr=new double[30]; cout.precision(9); FILE *file; file = fopen ("Hw02_01.txt","r"); if(!file) cout<<"error"; for (int i = 0; i < 7; i++) { for (int k = 0; k < 4; k++) { fscanf(file,"%f",&ptr); } } 編譯可以過,但是一執行就錯誤了。 不知是否可以再請各位高手幫我看看.. ※ 編輯: j16598231 來自: 118.171.85.198 (10/12 00:47)

10/12 01:34, , 14F
1. 先檢查fopen之後file是不是NULL, 你要確定開檔有成功
10/12 01:34, 14F

10/12 01:34, , 15F
才對檔案做存取.
10/12 01:34, 15F
上面我加上了 if(!file) cout<<"error"; 並沒顯示錯誤訊息,所以檔案應該是有開成功。

10/12 01:36, , 16F
2. 我不太記得是printf還是scanf, 把%f換成%lf試試.
10/12 01:36, 16F

10/12 01:36, , 17F
3. scanf後面要存入的變數有問題, 先想想, ptr new了30
10/12 01:36, 17F

10/12 01:37, , 18F
個double回來, 相當於寫了double ptr[30]; (但並不相等)
10/12 01:37, 18F

10/12 01:38, , 19F
你要如何把讀入的資料放入ptr[]裡?? 看起來這點您有兩個
10/12 01:38, 19F

10/12 01:39, , 20F
問題; a) 既然動態要了array來, 就表示您應該是有條件/
10/12 01:39, 20F

10/12 01:39, , 21F
有序的要放入ptr[]裡, 那你需要換算讀入的資料要放到
10/12 01:39, 21F

10/12 01:40, , 22F
ptr[]內哪個index位址去(或許可以用i/k間的計算得來).
10/12 01:40, 22F

10/12 01:40, , 23F
b) 假定你要放到index 10的位址, 那麼scanf裡的 &ptr 這
10/12 01:40, 23F

10/12 01:41, , 24F
裡要如何做修正.
10/12 01:41, 24F

10/12 01:43, , 25F
第3.點應該是關鍵, 給您的建議如同前面大大推過的, 先確
10/12 01:43, 25F

10/12 01:44, , 26F
保您用非動態陣列(如double ptr[30];)能運作正確, 再來
10/12 01:44, 26F

10/12 01:44, , 27F
考慮動態配置的作法(它們底層運作差很大, 但是access時
10/12 01:44, 27F

10/12 01:44, , 28F
的code卻寫起來很相像, 這是請您先練習靜態陣列的理由)
10/12 01:44, 28F
靜態與資料分隔是空白的話,語法我是這樣打。 double ptr[7][4]; cout.precision(10); ifstream fin; fin.open("Hw02_01.txt"); for(int i=0;i<7;i++) { for(int k=0;k<4;k++){ ptr[i][k]=0; } } for(int i=0;i<7;i++) { for(int k=0;k<4;k++) fin>>ptr[i][k]; } for(int i=0;i<7;i++) { for(int k=0;k<4;k++){ cout<<ptr[i][k]<<"\t"; } } ※ 編輯: j16598231 來自: 118.171.85.198 (10/12 02:15) ※ 編輯: j16598231 來自: 118.171.85.198 (10/12 02:19)

10/12 02:32, , 29F
err~~怎麼突然又從fscanf變成fin了Orz 不過就follow你寫
10/12 02:32, 29F

10/12 02:32, , 30F
的code給你的提示, 要做成二維的陣列來access, 你需要
10/12 02:32, 30F

10/12 02:33, , 31F
查一下動態二維陣列要怎麼玩(二維通了就能延伸到多維了)
10/12 02:33, 31F

10/12 02:34, , 32F
如果一時不會, 你可以先想想, 如果只有靜態一維陣列的情
10/12 02:34, 32F

10/12 02:34, , 33F
況(double ptr[7*4];//或4*7), 如何套回你上面的code.
10/12 02:34, 33F

10/12 02:35, , 34F
只是如果作業要求要用二維, 建議您直接查板上文章吧:)
10/12 02:35, 34F

10/12 02:37, , 35F
#1AFvltqI 小弟的拙作, 另外用 二維 加 動態 可以在板
10/12 02:37, 35F

10/12 02:37, , 36F
上找到很多文:)
10/12 02:37, 36F
抱歉,忘記要用fscanf寫出來... 動態二維陣列我是參考C++教學筆記網的方式,計算索引值位移量。 *(ptr + n*i + j) ←i當列,j當行。 ptr[i][j] ============================================================== 其實我現在最大的問題是在於怎麼利用fscanf語法或是其他語法,使得 遇到逗號時就跳過不取。 感謝您那麼晚還耐心地回答。 ^_^ ※ 編輯: j16598231 來自: 118.171.85.198 (10/12 02:52)

10/12 03:47, , 37F
fscanf("%lf,%lf,%lf",&a,&b,&c);
10/12 03:47, 37F

10/12 03:48, , 38F
char buffer[BUF_SIZE], ifstream ff;
10/12 03:48, 38F

10/12 03:48, , 39F
ff.getline(buffer, BUF_SIZE, ',');
10/12 03:48, 39F
文章代碼(AID): #1CifIFc0 (C_and_CPP)