• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語のファイル読み込み)

C言語でのファイル読み込み方法と配列の利用

このQ&Aのポイント
  • C言語を使用してCSVファイルを読み込む方法について説明します。
  • ファイル内のデータを配列に格納し、後で利用できるようにします。
  • 配列を使用することで、CSVファイル内のすべてのデータを読み込むことができます。

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

  • ベストアンサー
  • semisemi
  • ベストアンサー率72% (8/11)
回答No.5

No,4 の者です。 >ただ、xは全て表示されるものの、yはすべて0が表示されました。 >ちなみにcsvファイルはカンマ区切りです。 そりゃまあぁCSVっていうくらいですから普通はカンマ区切りです。 ソースの strtok(str, " ") strtok(NULL, " ") を strtok(str, ",") strtok(NULL, ",") に変えてみたらどうでしょうか。

maccor
質問者

お礼

2度も丁寧に回答いただきありがとうございました。 問題なくできました。感謝いたします。 これに新たな課題がありまして、以下に示すように また質問させていただきました。 お時間があるときにでもまたアドバイス等いただけると嬉しいです。 http://okwave.jp/qa/q7523113.html

その他の回答 (5)

回答No.6

フォーマットのエラーチェックが必要ないならこれでいいのでは、 #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; }

maccor
質問者

お礼

丁寧な回答ありがとうございます。 参考にさせていただきます。

  • semisemi
  • ベストアンサー率72% (8/11)
回答No.4

詳細な仕様や環境がわからないのでアレですが。(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

maccor
質問者

補足

やってみたところ、エラーもなく実行できました。 ただ、xは全て表示されるものの、yはすべて0が表示されました。 ちなみにcsvファイルはカンマ区切りです。

  • Layle
  • ベストアンサー率75% (6/8)
回答No.3

まずデータを展開するための配列が必要です。 配列を用意したら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 ); ※ コンパイルチェックもエラー処理もしてませんので、あくまで参考用です。

maccor
質問者

お礼

丁寧な回答ありがとうございました。 参考にさせていただきます。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>なんでこのプログラムで読めるんだろう.... 読めたと勘違いしているだけかと思われます。 >fscanf(file,"%ls,%ls",&i,&j); 不正な書式なのでfscanf()はエラーで抜けて、 >printf("i = %d : j = %d\n",i,j); で、たまたまメモリ上にあったゴミを整数として出力。 「なんか出力あったから読めた」という判定ではないでしょうか。 # fscanf()の書式を正しいものにしても、今度はprintf()でおかしな値になるワケですが…… # "%ls"正しい書式として処理されるfscanf()だと…どうなるんでしょうかねぇ。 # 文字列として扱われるなら高確率でふっとびそうですが。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

Fortran じゃないので, 配列を使っても「勝手にすべての行を読み込む」なんてことはしてくれませんよ. 配列を使おうと何しようと, 「行を読み込む」のはプログラマの責任. 1行目を読んだら, 次はどうなると思いますか? しかし, なんでこのプログラムで読めるんだろう....

関連するQ&A

専門家に質問してみよう