• 締切済み

テキストデータの読み込みについて

C言語のテキストデータの読み込みについてです。 C言語のプログラムについてです。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8                                       ↑ 上の様なカンマとスペースで15個に区切られているtxtファイルがあるのですが、このtxtデータの10コ目と11コ目をを計算で使いたく、取り出したいと考えているのですがscanfを使いどのように取り出すことが出来るのか、また取り出したデータから数値を引くことを教えて頂きたいです。 つまり -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2,             を取り出して計算に使いたいです。 そして1番上の数値だと、 -102.0と958.4 を読み込み、例えばそれぞれ100を引いた値を配列に入れたいです。 -102.0と958.4 → -202.0 と 858.4 のように取り出したいです。 教えて頂きたいです。お願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

もっと自前で: int ch; double a, b; while (....) { int column = 1; if ((ch = getc(fp)) == EOF) { break; } ungetc(ch, fp); while ((ch = getc(fp)) != '\n') { if (ch == ',' && ++column == 9) { break; } } if (ch == ',') { fscanf(fp, "%lf,%lf,", &a, &b); } else { ungetc(ch, fp); } while ((ch = getc(fp)) != '\n') { ; } } 意味にもよるが「スキャン」しないと「どこから読み出せばいいか」がわからないんだよね.

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.3

【番外】 scanfを使わず自前で・・。  char cBuff[ 128 ];  double d10, d11;   ・   ・  while( NULL != fgets( cBuff, 128, fp1 ) ){ // 1レコードずつ読み込み   d10 = toValW( 9, cBuff );  // 10コ目(前にコンマが9つ)   d11 = toValW( 10, cBuff ); // 11コ目   ・   ・計算で使用( -9999.9 除外◆)   ・   dHairetsu[ i ][ 0 ] = d10 - 100.0; // 配列に入れる   dHairetsu[ i ][ 1 ] = d11 - 100.0;   ・   ・  }  double toValW( int iCnt, char cBuff[] )  {   int i, nn = 0;   if( 0 == iCnt ) return( atof( cBuff ) );   for( i = 0; i < 128; i++ ){    if( ',' == cBuff[ i ] ){     nn++; // コンマをカウント     if( nn == iCnt ) return( atof( &cBuff[ i + 1 ] ) );    }   }   return( -9999.9 ); // ◆txtファイル異常だから、コメント出して終了(exit())がよいかも・・  }

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> この場合他のデータもスキャンされてしまうのではないでしょうか どの方法を使うにせよ、10番目と11番目を探すために、他のデータも「スキャン」する必要はあります(スキャンせずに済むのは、完全に固定長のフォーマットになっていて、場所を計算で求められる場合くらいでしょう) その上で、 読み込んだものを保存しない、とか使わない、とかで対応するのが普通だと思います。 マニュアルでscanfの書式のところを良く読んでください。 #1さんの方法は 「スキャンするけど変数には取り込まない」* を指定して、先頭9個と、12個目以降を取り込まずに、10、11番目だけ*を指定せずに取り込む、というものです。 (&cは書き間違いかと思います) これ以外なら、上記の読み飛ばす処理を自前でやるくらいでは。 (一文字ずつ読んでカンマの数を9個まで数えて、以降をscanfで2つ取り込む、以降改行まで空読み)

  • TT414
  • ベストアンサー率18% (72/384)
回答No.1

scanf("%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%lf,%lf,%*lf,%*lf,%*lf,%*lf",&a,&b,&c); a-=100; b-=100; ではだめなのでしょうか?

orz_123
質問者

補足

10個目と11個目のデータがほしく、得たデータを配列に入れたいんですが、この場合他のデータもスキャンされてしまうのではないでしょうか… 他のデータはいらなくて、10個目と11個目だけを取り出して配列に値を入れたいと考えています。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8 の5つ連続する値のうち -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2  を取り出したいと考えています。