プロが教える店舗&オフィスのセキュリティ対策術

新年早々、初歩的な質問で申し訳ありません。
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...

A 回答 (3件)

freadを使いますが。



どんな風に書きましたか?
それがあれば、添削できると思いますが。

あと、細かいところかもしれませんが
getc(fp)を unsiged charで直接受けてる
→入力のエラーチェックできてません。より安全にするにはエラーチェックした方がいいです

fcloseがない
→mainの終了でcloseされますが、プログラムが長くなると、それだけ開きっぱなしになります。
読み込みが終わったらfcloseするのがよいでしょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
返信遅くなって申し訳ありません。

//現在の読み込み処理
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でもあまり読み込み時間が変わらないらしく。。。(涙)


ともかく、エラーチェックなどの添削もして頂いて参考になりました。
有難う御座いました。

お礼日時:2010/01/03 22:35

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2010/01/04 00:01

fread()の使い方を間違えているのでしょう。



fread(data[i][j], 1, 16, fp);
と書いているとか…
# 型違いでエラーになる…ハズですけど。

>これは一回一回ファイルにアクセスしているためだと考えられると思うのですが

ーよっぽどアホゥなライブラリでない限り、ある程度バッファリングされているハズです。
# fopen()の拡張オプションなどでバッファリングを禁止していない限り…。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
返信遅くなって申し訳ありません。

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

有難う御座いました。

お礼日時:2010/01/03 22:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!