- ベストアンサー
配列のファイル読み込みの方法
配列のファイル読み込みの方法が分かりません。一応次に示すプログラムまで作りました。 1 23 2 40 3 : 4 : : : : : 5000 4098 というテキストファイルを読み込んで、出力したいです。 #include <stdio.h> int main(void){ FILE *fp; double x[5000]; double y[5000]; if((fp=fopen("demo-10mTorr-30W.txt","r"))==NULL){ printf("ファイルが開けません\n"); } while(fgets(x,5000,fp)!=NULL){ printf("%f %f\n",x,y); } } fclose(fp); return 0; } ・分からない点 配列の読み込み方。 またこれを実行した場合、全て0が出力されてしまいます。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
☆ float → %f double → %lf http://www.k-cube.co.jp/wakaba/server/format.html --------------------------------- >というテキストファイルを読み込んで、出力したいです。 「だけ」でしたら、「配列」は必要ありません。 ☆レコード(行)を、\n までの文字列として読み込み、そのまま出力するだけ。 char cBuf[256]; 256 は、レコードの最長よりも大きいこと。 while( NULL != fgets( cBuf, 256, fp ) ){ 1行ずつ読み込む、256 は「文字数」 printf( "%s", cBuf ); 改行の \n は cBuf の末端に(読み込まれて)入っている。 } http://www.bohyoh.com/CandCPP/C/Library/fgets.html --------------------------------- >配列の読み込み方。 配列「へ」の読み込み方。・・ですよね(=配列へ格納)。 ☆5000行全てを読み終えてから、(何らかの処理をし)、出力するのであれば「配列」が必要。 データが整数である場合、 int iX[5000], iY[5000], nn = 0, i; while( EOF != fscanf( fp, "%d %d", &iX[nn], &iY[nn] ) ){ nn++; ( 5000 over チェック省略) } (何らかの処理) for( i = 0; i < nn; i++ ){ printf( "%4d %4d\n", iX[i], iY[i] ); } データが実数である場合、 int nn = 0, i; float fX[5000], fY[5000]; while( EOF != fscanf( fp, "%f %f", &fX[nn], &fY[nn] ) ){ nn++; } (略) http://www.bohyoh.com/CandCPP/C/Library/fscanf.html
その他の回答 (4)
- lailai2580
- ベストアンサー率64% (16/25)
数値と数値の間の空白が1つだという前提で文字列を分解してみました。 結構面倒な…。 こんな感じですかねー? char s[5000], sx[5000], sy[5000]; int i, n; /* ↑必要な宣言を追加しました↑ */ fgets(s, 5000, fp); for(i = 0; i < 5000; i++){ if(s[i] == ' ' || s[i] == '\t'){ strncpy(sx, s, i); sx[i] = '\0'; x[0] = atof(sx); n = i+1; } else if(s[i] == '\n'){ strncpy(sy, &s[n], n-i); sy[n-i] = '\0'; y[0] = atof(sy); break; } }
- asuncion
- ベストアンサー率33% (2127/6289)
さらに付け加えると、ファイルをオープンできなかったときにも 中身を読もうとしている点に問題があります。
- precog
- ベストアンサー率22% (966/4314)
ヒント: scanfファミリー >printf("%f %f\n",x,y); x, yは配列の先頭アドレスを表すので、タイプが一致してません。
- koko_u_
- ベストアンサー率18% (459/2509)
fgets() は「一行」を「文字列」に格納するので、それを自前で分解して下さい。