• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:プログラムの合成願い)

プログラムの合成願い

このQ&Aのポイント
  • N行*M列のエクセルデータをCSV形式にし、読み込むプログラムを作成しました。
  • N行*M列のエクセルデータをCSV形式に変換し、それを読み込むプログラムを作成しました。
  • N行*M列のエクセルデータをCSV形式に変換するプログラムを作成しました。

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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; } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

umenuki
質問者

お礼

ありがとうございます!

その他の回答 (2)

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

申し訳ありませんでした。 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)
回答No.1

「合成」とか「合わせる」とか書いてあるけど, 要するに何をするプログラムが作りたいの? 「行列の数を計算する」というのも日本語としておかしいし....

umenuki
質問者

補足

行列数をNとMをだし、 それを上に記述してあるプログラムのNとMにあてはめるプログラムです

関連するQ&A