- ベストアンサー
C言語でのファイル読み込み方法と配列の利用
- C言語を使用してCSVファイルを読み込む方法について説明します。
- ファイル内のデータを配列に格納し、後で利用できるようにします。
- 配列を使用することで、CSVファイル内のすべてのデータを読み込むことができます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No,4 の者です。 >ただ、xは全て表示されるものの、yはすべて0が表示されました。 >ちなみにcsvファイルはカンマ区切りです。 そりゃまあぁCSVっていうくらいですから普通はカンマ区切りです。 ソースの strtok(str, " ") strtok(NULL, " ") を strtok(str, ",") strtok(NULL, ",") に変えてみたらどうでしょうか。
その他の回答 (5)
- yaemon_2006
- ベストアンサー率22% (50/220)
フォーマットのエラーチェックが必要ないならこれでいいのでは、 #include <stdio.h> int main(void) { FILE *fp = fopen("test.txt", "r"); double a, b; if(!fp) return 1; while(fscanf(fp, "%lf ,%lf", &a, &b) == 2) printf("%f %f\n", a, b); fclose(fp); return 0; }
お礼
丁寧な回答ありがとうございます。 参考にさせていただきます。
- semisemi
- ベストアンサー率72% (8/11)
詳細な仕様や環境がわからないのでアレですが。(CSVのxとyがスペース区切りだという前提で) たぶん以下のようなコードで読み込めるんじゃないでしょうか。 ただ、このコード。エラーの処理とかは何もしてないので、気をつけてください。 データが2000行以上あったり、ファイルが開けなかったり、 あるいはファイルの一行が128文字以上だったりした場合の処理はしていません。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *file; double x[2000], y[2000]; char str[128]; char *tp; int counter = 0; int i; file = fopen("sample.csv", "r"); while (fgets(str, 128, file) != NULL) { if ((tp = strtok(str, " ")) != NULL) { x[counter] = atof(tp); } if ((tp = strtok(NULL, " ")) != NULL) { y[counter] = atof(tp); } counter++; } /* この段階でデータは配列 x[] と y[] に格納されているはず */ /* 以下のforで表示 */ for (i = 0 ; i < counter ; i++) { printf("x=%f y=%f\n", x[i], y[i]); } fclose(file); return 0; } //end of main
補足
やってみたところ、エラーもなく実行できました。 ただ、xは全て表示されるものの、yはすべて0が表示されました。 ちなみにcsvファイルはカンマ区切りです。
- Layle
- ベストアンサー率75% (6/8)
まずデータを展開するための配列が必要です。 配列を用意したらfgetsなどの関数で一行読み込み、strtokなどで分解する処理をループで回せばよいかと思います。 (fscanfは個人的にはあまりお勧めはできません) とりあえずこんな感じで出来ると思います。 double adTime[2000]; double adValue[2000]; FILE* fp; char szBuffer[256]; int nIndex; fp = fopen( "sample.csv", "r" ); for( nIndex = 0 ; fgets( szBuffer, sizeof( szBuffer ), fp ) != NULL ; nIndex++ ) { // 一行の分解 (スペース区切り) adTime[nIndex] = atof( strtok( szBuffer, " " ) ); // Timeを取り出す adValue[nIndex] = atof( strtok( NULL, " " ) ); // 値を取り出す } fclose( fp ); ※ コンパイルチェックもエラー処理もしてませんので、あくまで参考用です。
お礼
丁寧な回答ありがとうございました。 参考にさせていただきます。
- Wr5
- ベストアンサー率53% (2173/4061)
>なんでこのプログラムで読めるんだろう.... 読めたと勘違いしているだけかと思われます。 >fscanf(file,"%ls,%ls",&i,&j); 不正な書式なのでfscanf()はエラーで抜けて、 >printf("i = %d : j = %d\n",i,j); で、たまたまメモリ上にあったゴミを整数として出力。 「なんか出力あったから読めた」という判定ではないでしょうか。 # fscanf()の書式を正しいものにしても、今度はprintf()でおかしな値になるワケですが…… # "%ls"正しい書式として処理されるfscanf()だと…どうなるんでしょうかねぇ。 # 文字列として扱われるなら高確率でふっとびそうですが。
- Tacosan
- ベストアンサー率23% (3656/15482)
Fortran じゃないので, 配列を使っても「勝手にすべての行を読み込む」なんてことはしてくれませんよ. 配列を使おうと何しようと, 「行を読み込む」のはプログラマの責任. 1行目を読んだら, 次はどうなると思いますか? しかし, なんでこのプログラムで読めるんだろう....
お礼
2度も丁寧に回答いただきありがとうございました。 問題なくできました。感謝いたします。 これに新たな課題がありまして、以下に示すように また質問させていただきました。 お時間があるときにでもまたアドバイス等いただけると嬉しいです。 http://okwave.jp/qa/q7523113.html