• ベストアンサー

配列のファイル読み込みの方法

配列のファイル読み込みの方法が分かりません。一応次に示すプログラムまで作りました。 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が出力されてしまいます。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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)

回答No.4

数値と数値の間の空白が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)
回答No.3

さらに付け加えると、ファイルをオープンできなかったときにも 中身を読もうとしている点に問題があります。

  • precog
  • ベストアンサー率22% (966/4314)
回答No.2

ヒント: scanfファミリー >printf("%f %f\n",x,y); x, yは配列の先頭アドレスを表すので、タイプが一致してません。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

fgets() は「一行」を「文字列」に格納するので、それを自前で分解して下さい。