- ベストアンサー
プログラムの合成願い
- N行*M列のエクセルデータをCSV形式にし、読み込むプログラムを作成しました。
- N行*M列のエクセルデータをCSV形式に変換し、それを読み込むプログラムを作成しました。
- N行*M列のエクセルデータをCSV形式に変換するプログラムを作成しました。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2 です。 続きです。 int main( int argv, char *argc[] ) { char filename[ 256 ]; FILE *fp; if( argv > 1 ){ strcpy( filename, argc[1] ); }else{ printf( "Please Input Filename:" ); scanf( "%s", filename ); } if(( fp = fopen( filename, "r" ) )== NULL ){ printf( " file open error!!\n" ); return -1; } GetGyouRetsuSu( fp ); // 行、列数取得 fseek( fp, 0, SEEK_SET ); // ファイル先頭へ double **csvdata; // ★注目 int i, j; csvdata = (double **)malloc( sizeof(double*) * igN ); for( i = 0; i < igN; i++ ){ // 各ポインタに対して、サイズを割当て csvdata[ i ] = (double *)malloc( sizeof(double) * igM ); } for( i = 0; i < igN; i++ ){ for( j = 0; j < igM; j++ ){ csvdata[i][j] = 0.0; } } csv_read( fp, csvdata ); // 読み込み for( i = 0; i < igN; i++ ){ printf( "%f", csvdata[i][0] ); for( j = 1; j < igM; j++ ){ printf( "\t%f", csvdata[i][j] ); } printf( "\n" ); } free( csvdata ); return 0; } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (2)
- yama5140
- ベストアンサー率54% (136/250)
申し訳ありませんでした。 http://okwave.jp/qa/q6469207.html ここの、#3, #4, #7 です。確かに、 #4補>おそらく勘違いされていると思う でした。(投稿により、インデントタブが消えて) 動かないプログラムの「動かない」に、年寄りの目がいってしまった。 一旦思いこんでしまうと、#6 さんの回答のあとでも気づかず・・残念。 +++++++++++++++++++++++++++++++++++++++++ M と N をグローバル変数(◆)にしたものを、作ってみました。 プチ1チェック:連続する SEP_DATA をチェック プチ2チェック:SEP_DATA 総数を行数で割って余りがあるかをチェック #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 #define SEP_DATA ',' int igN = 0, igM; // ◆ void GetGyouRetsuSu( FILE *fp ) { int nn = 0, k, iRenzoku; char line[ SIZE ]; while( NULL != fgets( line, SIZE, fp ) ){ iRenzoku = k = 0; igN++; // 行数カウント while( line[ k ] ){ if( SEP_DATA == line[ k ] ){ if( ( iRenzoku + 1 ) == k ) exit( 1 ); // プチ1チェック iRenzoku = k; nn++; } k++; } } if( nn % igN ) exit( 2 ); // プチ2チェック igM = nn / igN + 1; // デリミタ+1 = 列数 } void csv_read( FILE *fp, double **csv ) { char line[ SIZE ], *ptr; int i = 0, j, k; while( fgets( line, SIZE, fp ) != NULL ){ printf( "*%s", line ); ptr = line; j = 0; do{ csv[ i ][ j ] = atof( ptr ); ptr = strchr( ptr, SEP_DATA ); if( ptr != NULL ){ ptr++; j++; } }while( ( ptr != NULL ) && ( j < igM ) ); i++; } fclose( fp ); } 全部投稿できないため、ここで分割します。
- Tacosan
- ベストアンサー率23% (3656/15482)
「合成」とか「合わせる」とか書いてあるけど, 要するに何をするプログラムが作りたいの? 「行列の数を計算する」というのも日本語としておかしいし....
補足
行列数をNとMをだし、 それを上に記述してあるプログラムのNとMにあてはめるプログラムです
お礼
ありがとうございます!