- ベストアンサー
表示がおかしくなる
ファイルdata.txtの内容を読み込んで出力するプログラムです。ファイルの内容と一致しません。どうしてでしょうか?? ■プログラム #include<iostream.h> int main(void){ FILE *fp; char ch; int n,m,a,b,c,d; char in[2]; if(( fp = fopen("data.txt","r")) == NULL){ cout << "error!" << endl; exit(1); } while(fscanf(fp,"%d,%d,%s", &n,&m,&in) != EOF){ cout << "n=" << n << ",m=" << m; cout <<",in=" << in; cout << endl; } return 0; } ■data.txt 19980105,0101,ys 19980105,0201,dd 19980105,1301,rg 19980105,1301,ab 19980105,1301,gr 19980105,1319,or ■実際に表示されたもの n=19980105,m=0,in=ys n=19980105,m=0,in=dd n=19980105,m=1280,in=rg n=19980105,m=1280,in=ab n=19980105,m=1280,in=gr n=19980105,m=1280,in=or mがおかしくなってしまっているのが分かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
char in[2]; を char in[3]; にする現状ではメモリがあふれていると思われる。
その他の回答 (2)
- Trick--o--
- ベストアンサー率20% (413/2034)
びふぉー cout << "n=" << n << ",m=" << m; cout <<",in=" << in; cout << endl; ぱっと見で何をしているか理解しにくい。 #2さんのC書式でもいいが、sprintfを使うだけでも違うだろう。 あふたー char szBuf[LENGTH]; // LENGTHは適当に。 sprintf(szBuf, "n=%d, m=%d, in=%s", n, m, in); cout << szBuf << endl; すっきりしたでしょう。 致命的な修正点はすでに指摘されているので、そちらを参考に。
- mac_res
- ベストアンサー率36% (568/1571)
>while(fscanf(fp,"%d,%d,%s", &n,&m,&in) != EOF){ inが溢れているだけでなく、inは文字配列なので、&は不要。 ほかにも、a,b,c,d,chは未使用。coutを使うことで、全体に見苦しいプログラムになっている。 こんなことなら、Cの書式で書いたほうがまし。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- include<stdio.h> #include<stdlib.h> #include<errno.h> int main(void){ FILE *fp; int n,m; char in[BUFSIZ]; if(( fp = fopen("data.txt","r")) == NULL){ fprintf(stderr, "Can't open data.txt\n"); exit(errno); } while(fscanf(fp,"%d,%d,%s", &n,&m,in) != EOF){ printf("n=%d,m=%d,in=%s\n", n,m,in); } return 0; }