[問題] 讀檔做數字運算(C++)
( *[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
10/11 12:40, 1F
我上的課程、課本、老師教的都是寫C++..
我只是想說fscanf()沒教過,教的是檔案>>變數(用串流符號)與cout。
可能有哪邊文意表達不清楚,抱歉!
→
10/11 12:42, , 2F
10/11 12:42, 2F
→
10/11 12:43, , 3F
10/11 12:43, 3F
抱歉,上面那段我看不懂。 我的目的只是用動態記憶體表示一個二維陣列而已!
推
10/11 12:45, , 4F
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:34, 7F
→
10/11 20:35, , 8F
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
10/11 22:11, 11F
推
10/11 22:45, , 12F
10/11 22:45, 12F
推
10/11 23:09, , 13F
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
10/12 01:34, 14F
→
10/12 01:34, , 15F
10/12 01:34, 15F
上面我加上了
if(!file)
cout<<"error";
並沒顯示錯誤訊息,所以檔案應該是有開成功。
→
10/12 01:36, , 16F
10/12 01:36, 16F
→
10/12 01:36, , 17F
10/12 01:36, 17F
→
10/12 01:37, , 18F
10/12 01:37, 18F
→
10/12 01:38, , 19F
10/12 01:38, 19F
→
10/12 01:39, , 20F
10/12 01:39, 20F
→
10/12 01:39, , 21F
10/12 01:39, 21F
→
10/12 01:40, , 22F
10/12 01:40, 22F
→
10/12 01:40, , 23F
10/12 01:40, 23F
→
10/12 01:41, , 24F
10/12 01:41, 24F
→
10/12 01:43, , 25F
10/12 01:43, 25F
→
10/12 01:44, , 26F
10/12 01:44, 26F
→
10/12 01:44, , 27F
10/12 01:44, 27F
→
10/12 01:44, , 28F
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
10/12 02:32, 29F
→
10/12 02:32, , 30F
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
10/12 02:34, 33F
→
10/12 02:35, , 34F
10/12 02:35, 34F
→
10/12 02:37, , 35F
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
10/12 03:47, 37F
→
10/12 03:48, , 38F
10/12 03:48, 38F
→
10/12 03:48, , 39F
10/12 03:48, 39F