• 締切済み

テキストデータから構造体にデータを保存する方法

C言語初心者です。 大きなテキストデータ(730MB)からデータを取得して、構造体に保存し表示するというプログラムを作成しています。テキストのサイズが大きいため構造体のサイズを400000とし、 残りをftellとfseekを使用してファイルポインタをずらして全データを順次読み込んで表示しようとしているのですが、実行すると400000行目以降(最初の構造体のMAX時点)がうまく読み込めません。 詳しい方がいましたら、ご教授願います。 #define MAX_SIZE 400000 char filename[] = ″test.txt"; struct ALL_DATA{ char cmd[10]; int addr; int bsize; }; for (int lp = 0; lp < 100; lp++){ FILE *fp; struct ALL_DATA ADATA[MAX_SIZE]; // 構造体配列の宣言 if (lp > 0){ fseek(fp, LP, SEEK_SET); } if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } for (fc = 0; fc < MAX_SIZE; fc++) { if (feof(fp)){ break; } else{ fscanf(fp, "%s %d %d\n", ADATA[fc].cmd, &ADATA[fc].addr, &ADATA[fc].bsize); } } LP = ftell(fp); //現在のFPの取得 printf("********** FP-> %ld *********\n", LP); fclose(fp); while (i < MAX_SIZE){ if (loopcnt == 0){ printf("ADATA[i].cmd -> %s, ADATA[i].addr -> %d, ADATA[i].bsize -> %s\n",ADATA[i].cmd, ADATA[i].addr, ADATA[i].bsize); // i++; } } 上記のような形で作成しています(一部抜粋)。 読み込むテキストデータは testA 123456 20 testA 23415 2 testB 12114567 678 のように「文字列 スペース 数字 スペース 数字」と並んでおり 値はランダムになっています。 初めて質問するため、わかりにくい記述があるかと思いますが、よろしくお願いします。

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.1

こんにちは if (lp > 0){ fseek(fp, LP, SEEK_SET); } if ((fp = fopen(filename, "r")) == NULL){ printf("%s open error !\n", filename); exit(1); } seekとopenの順番が逆だと思います。 ただ、この処理の場合、そもそも、毎回openする必要がないので、seekも不要と思います。 外側のforループ for (int lp = 0; lp < 100; lp++){ の外でopenすればよいです。 さらに書くと、配列も不要にできそうな気がしますが、それは処理内容次第ですかね。

sgurk
質問者

お礼

titokani さん ご回答ありがとうございます。 今回、表示ができるようになったら、取り込んだデータに沿って、別動作を実施させる予定でした。 そのため、いったん配列に登録し、参照しようと思い配列を使用しました。 テキストのデータは3千万行を超えており、配列のサイズに指定することができなかったため seekを使用して、いったん400000行の処理を実行後にFPを進めて 再度読み込み⇒処理実行を繰り返し、3千万行分を実行しようと考えていました。 説明が足らず申し訳ございません。 この場合、mallocで動的に値を配列のサイズを確保したほうがいいのでしょうか? まずは、seekとopenの順序変更を試してみたいと思います。

関連するQ&A

専門家に質問してみよう