- 締切済み
テキストデータの読み込みについて
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 のように取り出したいです。 教えて頂きたいです。お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
もっと自前で: 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)
【番外】 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)
> この場合他のデータもスキャンされてしまうのではないでしょうか どの方法を使うにせよ、10番目と11番目を探すために、他のデータも「スキャン」する必要はあります(スキャンせずに済むのは、完全に固定長のフォーマットになっていて、場所を計算で求められる場合くらいでしょう) その上で、 読み込んだものを保存しない、とか使わない、とかで対応するのが普通だと思います。 マニュアルでscanfの書式のところを良く読んでください。 #1さんの方法は 「スキャンするけど変数には取り込まない」* を指定して、先頭9個と、12個目以降を取り込まずに、10、11番目だけ*を指定せずに取り込む、というものです。 (&cは書き間違いかと思います) これ以外なら、上記の読み飛ばす処理を自前でやるくらいでは。 (一文字ずつ読んでカンマの数を9個まで数えて、以降をscanfで2つ取り込む、以降改行まで空読み)
- TT414
- ベストアンサー率18% (72/384)
scanf("%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%*lf,%lf,%lf,%*lf,%*lf,%*lf,%*lf",&a,&b,&c); a-=100; b-=100; ではだめなのでしょうか?
補足
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 を取り出したいと考えています。