[爆卦]fscanf數字是什麼?優點缺點精華區懶人包

為什麼這篇fscanf數字鄉民發文收入到精華區:因為在fscanf數字這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者j16598231 (滎鶄)看板C_and_CPP標題[問題] 讀檔做數字運算(C++)時間Mo...


( *[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
loveme00835:不是有用到new就叫C++... 10/11 12:40
我上的課程、課本、老師教的都是寫C++..
我只是想說fscanf()沒教過,教的是檔案>>變數(用串流符號)與cout。
可能有哪邊文意表達不清楚,抱歉!
loveme00835:string + replace + stringstream + istream_iterator 10/11 12:42
loveme00835:+ vector, 連記憶體配置都不用你做 10/11 12:43
抱歉,上面那段我看不懂。 我的目的只是用動態記憶體表示一個二維陣列而已!
loveme00835:另外你會亂碼的原因是因為預期讀入double結果讀到逗號 10/11 12:45
loveme00835:錯誤旗標升起, 之後的讀取動作都不算, 你看到的只是他 10/11 12:46
loveme00835:原本的垃圾值 10/11 12:46
那我應該使用char嗎? 先讀成字元在轉成數字? 那請問要怎麼讀到逗號就把陣列+1呢?
while(fin==','); 這樣好像也怪怪的。
麻煩各位,感恩。
※ 編輯: j16598231 來自: 118.171.85.198 (10/11 19:58)
xatier:http://www.cppreference.com/wiki/c/io/start 把它讀懂 10/11 20:34
xatier:看一下scanf()和fscanf() 和其他常用的IO函式 10/11 20:35
loveme00835:我關鍵字都打那麼多了...你確定你的行列都已知的話就 10/11 22:10
loveme00835:用靜態陣列就好了啊, 動態比較容易搞炸掉, 在你很熟練 10/11 22:11
loveme00835:之前還是用STL容器來做就好, 存取的語法也可以一樣 10/11 22:11
loveme00835:而且沒教過就可以不會的話, 你可以別學了... 10/11 22:45
hilorrk:老師也沒教過我用PTT問問題ㄟ 10/11 23:09
感謝上面各位的回文。
平常寫程式我有問題都是去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)
VictorTom:1. 先檢查fopen之後file是不是NULL, 你要確定開檔有成功 10/12 01:34
VictorTom:才對檔案做存取. 10/12 01:34
上面我加上了
if(!file)
cout<<"error";
並沒顯示錯誤訊息,所以檔案應該是有開成功。
VictorTom:2. 我不太記得是printf還是scanf, 把%f換成%lf試試. 10/12 01:36
VictorTom:3. scanf後面要存入的變數有問題, 先想想, ptr new了30 10/12 01:36
VictorTom:個double回來, 相當於寫了double ptr[30]; (但並不相等) 10/12 01:37
VictorTom:你要如何把讀入的資料放入ptr[]裡?? 看起來這點您有兩個 10/12 01:38
VictorTom:問題; a) 既然動態要了array來, 就表示您應該是有條件/ 10/12 01:39
VictorTom:有序的要放入ptr[]裡, 那你需要換算讀入的資料要放到 10/12 01:39
VictorTom:ptr[]內哪個index位址去(或許可以用i/k間的計算得來). 10/12 01:40
VictorTom:b) 假定你要放到index 10的位址, 那麼scanf裡的 &ptr 這 10/12 01:40
VictorTom:裡要如何做修正. 10/12 01:41
VictorTom:第3.點應該是關鍵, 給您的建議如同前面大大推過的, 先確 10/12 01:43
VictorTom:保您用非動態陣列(如double ptr[30];)能運作正確, 再來 10/12 01:44
VictorTom:考慮動態配置的作法(它們底層運作差很大, 但是access時 10/12 01:44
VictorTom:的code卻寫起來很相像, 這是請您先練習靜態陣列的理由) 10/12 01:44
靜態與資料分隔是空白的話,語法我是這樣打。
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)
VictorTom:err~~怎麼突然又從fscanf變成fin了Orz 不過就follow你寫 10/12 02:32
VictorTom:的code給你的提示, 要做成二維的陣列來access, 你需要 10/12 02:32
VictorTom:查一下動態二維陣列要怎麼玩(二維通了就能延伸到多維了) 10/12 02:33
VictorTom:如果一時不會, 你可以先想想, 如果只有靜態一維陣列的情 10/12 02:34
VictorTom:況(double ptr[7*4];//或4*7), 如何套回你上面的code. 10/12 02:34
VictorTom:只是如果作業要求要用二維, 建議您直接查板上文章吧:) 10/12 02:35
VictorTom:#1AFvltqI 小弟的拙作, 另外用 二維 加 動態 可以在板 10/12 02:37
VictorTom:上找到很多文:) 10/12 02:37
抱歉,忘記要用fscanf寫出來...
動態二維陣列我是參考C++教學筆記網的方式,計算索引值位移量。
*(ptr + n*i + j) ←i當列,j當行。 ptr[i][j]
==============================================================
其實我現在最大的問題是在於怎麼利用fscanf語法或是其他語法,使得
遇到逗號時就跳過不取。

感謝您那麼晚還耐心地回答。 ^_^
※ 編輯: j16598231 來自: 118.171.85.198 (10/12 02:52)
tropical72:fscanf("%lf,%lf,%lf",&a,&b,&c); 10/12 03:47
tropical72:char buffer[BUF_SIZE], ifstream ff; 10/12 03:48
tropical72:ff.getline(buffer, BUF_SIZE, ','); 10/12 03:48

你可能也想看看

搜尋相關網站