• ベストアンサー

C言語におけるファイル読み込みor書き込みの高速化がうまくいかない

新年早々、初歩的な質問で申し訳ありません。 C言語でファイルからの数値データの読み込み/書き込みを高速化したいと思っています。例えば、ファイルの数値データ 「0123456789abcdef...」 を、配列で取り込んで 「30313233343536373839616263646566...」 のようにprinf等で表示させたいと思っています。 とりあえず、読み込みの場合のみ示します。 現在,下のサンプルプログラムで示すようにgetcで一個ずつ取りこんでいますが、これだとデータの数がばかでかくなると大変な時間がかかってしまいます。これは一回一回ファイルにアクセスしているためだと考えられると思うのですが,これをファイルアクセス回数を減らし(つまり、ループ回数を減らし)一気に読み込みたいのですが,どうもうまくいきません。 この場合、ネットで調べたものの、どのようなI/O関数を使えばよいかわからず、freadとかを使うとバグってうまく読み込めません。 I/Oの取扱いが苦手なので原因なのですが、わかりやすく教えて頂けると助かります。 初歩的な質問で恐縮ですが、よろしくお願いします。 書き込みの方も教えて頂けると幸いです。 --------------------------------------------- #include <stdio.h> #define SIZE (65536*10) int main(int argc, char** argv){ unsigned long long int i; int j; unsigned char data[SIZE][16]; FILE *fp; fp = fopen("filein.dat", "rb"); //現在の読み込み処理 unsigned char tmp; for(i=0; i<SIZE; i++){ for(j=0; j<16; j++){ data[i][j] = getc(fp); } } /* //表示 for(i=0; i<SIZE; i++){ for(j=0; j<16; j++){ printf("%2x", data[i][j]); } puts(""); } */ return 0; } ------------------------------------------------- //filein.dat 0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef...

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

freadを使いますが。 どんな風に書きましたか? それがあれば、添削できると思いますが。 あと、細かいところかもしれませんが getc(fp)を unsiged charで直接受けてる →入力のエラーチェックできてません。より安全にするにはエラーチェックした方がいいです fcloseがない →mainの終了でcloseされますが、プログラムが長くなると、それだけ開きっぱなしになります。 読み込みが終わったらfcloseするのがよいでしょう。

g47040
質問者

お礼

回答ありがとうございます。 返信遅くなって申し訳ありません。 //現在の読み込み処理 unsigned char tmp; for(i=0; i<SIZE; i++){ for(j=0; j<16; j++){ data[i][j] = getc(fp); } } の部分を fread( data[0], sizeof( unsigned char ), (int)16*SIZE, fp ); に変えたら、正しく動きました。以前のがうまくいかなかった理由は、、、すいません、わかりません。以前のコードを消してしまったみたいで見付かりませんでした。ごめんなさい。 ただ、正しく動いたものの、freadでもまだまだ遅いことがわかって、少々ヘコんでおります。ネットでざっくり調べたら、readでもあまり読み込み時間が変わらないらしく。。。(涙) ともかく、エラーチェックなどの添削もして頂いて参考になりました。 有難う御座いました。

その他の回答 (2)

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

mmap なり MapViewOfFile なりを適切に使えば高速化できるかも.

g47040
質問者

お礼

回答有難う御座います。 早速確認してみます。

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

fread()の使い方を間違えているのでしょう。 fread(data[i][j], 1, 16, fp); と書いているとか… # 型違いでエラーになる…ハズですけど。 >これは一回一回ファイルにアクセスしているためだと考えられると思うのですが ーよっぽどアホゥなライブラリでない限り、ある程度バッファリングされているハズです。 # fopen()の拡張オプションなどでバッファリングを禁止していない限り…。

g47040
質問者

お礼

回答ありがとうございます。 返信遅くなって申し訳ありません。 一応、解決しました。下の方のお礼もある通りにすると、問題なく動きました。 >fread()の使い方を間違えているのでしょう。 おっしゃる通りだったのかもしれません。 ともかく、原因は自分のミスだった、ということがわかっただけでも回答して頂いて助かりました。 有難う御座いました。

関連するQ&A

専門家に質問してみよう