• 締切済み

Cで2次元配列にCSVファイルを格納するには?

~.csvというファイルがあって、ファイルの中身は256*256のある数字の2次元配列です。 このファイルを読み込んで、2次元配列に格納したいのですが、どのようなソースを書けばいいのでしょうか? プログラミングをちゃんと勉強してこなかったために苦戦しています。 #include <stdio.h> #include <stdlib.h> int main(int argc,char *argv[]){ FILE *fi; char I[256]; char J[256]; if((fi=fopen("ch.csv","r"))==NULL){//csvもこのような記述でよみこむことができるのか? printf("ファイルオープンエラー\n"); exit(1); } while(fgets(J,256,fi) != NULL) { これより先が全く書けていない状態です。 ここまでもこのソースで大丈夫でしょうか? かなり基本的なことだと思いますが、よろしくお願いします。

みんなの回答

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

>ファイルの中身は256*256のある数字の2次元配列です。 >char J[256];  とされています。これを勝手に都合良く解釈し、    ・256は、文字数ではなく「データ個数」として  ・数字は「整数」として    fscanf() を使って、作ってみました(BorlandC++5.6.4)。   http://www.bohyoh.com/CandCPP/C/Library/fscanf.html    他の回答者の皆さんとは一風変わっていて、標準関数に「切り出し」をさせる方法です。 こんな方法もある、ということでソースを投稿します。 ---------------------------------------------- #include <stdio.h> #include <stdlib.h> void main() {  FILE *fi;  int kk = 0, nn = 0, iVal, iData[ 256 ][ 256 ];  if( NULL == ( fi = fopen( "ch.csv", "r" ) ) ){   printf( "ファイルオープンエラー\n" );   exit( 1 );  }  while( 1 == fscanf( fi, "%d,", &iVal ) ){ // "%d," の , に注目   iData[ kk ][ nn ] = iVal;   nn++;   if( 256 == nn ){ // 1行読み込み済み    kk++;    nn = 0;   }  }  fclose( fi );  if( ( 256 != kk ) || ( 0 != nn ) ){   printf( "ファイルエラー[%d][%d]\n", kk, nn );   exit( 2 );  } // 正常処理 } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

  • S117
  • ベストアンサー率40% (18/45)
回答No.3

csvのファイルをオープンする段階で疑問を抱いているようですが、そこに疑問があるのでしたら、C言語のファイル入出力について確認する必要があると思います。参考URLのページおよび、その次のページを参考にしてください。 要するに、CSVファイルはただのテキストファイルなので、「自分でカンマで区切って処理する」ということになります。

参考URL:
http://homepage3.nifty.com/mmgames/c_guide/17-01.html
  • stingy
  • ベストアンサー率37% (144/379)
回答No.2

>これより先が全く書けていない状態です。 とりあえず"J"の中身を確認しましょう。  while(fgets(J,256,fi) != NULL)  {   printf("%s\n",J);  }  fclose(fi);  return 0; } >ここまでもこのソースで大丈夫でしょうか? 格納先の2次元配列が見当たりませんが? I,Jの宣言も(意図するところは想像できますが)不適切だと思います。 まずは"J"の中身が意図した通りか確認。 "fgets(J,256,fi)"が適切か判断してください。 がんばって、1行だけ読んで何か(※)の[256]の配列に 格納するソースを書いてください。 ※文字か整数か実数か?質問から読み取れません。 それから2次元配列を考えましょう。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.1

まず疑問点。 >char I[256]; >char J[256]; は何を行うための配列? 二次元なら、buff[256][256]とかになるはずだけど。 >ここまでもこのソースで大丈夫でしょうか? >while(fgets(J,256,fi) != NULL) が駄目。 まず、CSVファイルの構成を理解する必要がある。 CSV形式で保存されている数値なら「文字列」として記録されているはず。また「CSV」なら区切りとして「,」があるから一行分読み込むとしたら、最低でも256(数値が一桁の場合)+255(256項目の区切りのカンマ)分はバッファが必要。 簡単な方法は、 1.とりあえず一行読む。 2.カンマ、もしくはデータの最後までデータを取得する。 3.取得したデータを数値変換して配列に格納。 4.2-3を一行分繰り返す 5.2-4を最後の行まで繰り返す。

関連するQ&A