
新年早々、初歩的な質問で申し訳ありません。
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...
No.1ベストアンサー
- 回答日時:
freadを使いますが。
どんな風に書きましたか?
それがあれば、添削できると思いますが。
あと、細かいところかもしれませんが
getc(fp)を unsiged charで直接受けてる
→入力のエラーチェックできてません。より安全にするにはエラーチェックした方がいいです
fcloseがない
→mainの終了でcloseされますが、プログラムが長くなると、それだけ開きっぱなしになります。
読み込みが終わったらfcloseするのがよいでしょう。
回答ありがとうございます。
返信遅くなって申し訳ありません。
//現在の読み込み処理
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でもあまり読み込み時間が変わらないらしく。。。(涙)
ともかく、エラーチェックなどの添削もして頂いて参考になりました。
有難う御座いました。
No.3
- 回答日時:
mmap なり MapViewOfFile なりを適切に使えば高速化できるかも.
No.2
- 回答日時:
fread()の使い方を間違えているのでしょう。
fread(data[i][j], 1, 16, fp);
と書いているとか…
# 型違いでエラーになる…ハズですけど。
>これは一回一回ファイルにアクセスしているためだと考えられると思うのですが
ーよっぽどアホゥなライブラリでない限り、ある程度バッファリングされているハズです。
# fopen()の拡張オプションなどでバッファリングを禁止していない限り…。
回答ありがとうございます。
返信遅くなって申し訳ありません。
一応、解決しました。下の方のお礼もある通りにすると、問題なく動きました。
>fread()の使い方を間違えているのでしょう。
おっしゃる通りだったのかもしれません。
ともかく、原因は自分のミスだった、ということがわかっただけでも回答して頂いて助かりました。
有難う御座いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でファイル読み書きを早く...
-
複数ファイルの同時読み込みの...
-
ファイルに行番号を追加
-
fgets( ) の返り値は何?
-
fscanfでループしてしまう。
-
辞書順にソートしたいのですが...
-
C言語 共用体の構造体の引数設定
-
C言語 バイナリデータのサイズ...
-
main.c:7:43: warning: implici...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
有効数字について 以前質問をし...
-
プログラムでの数字につく”f”の...
-
「指定されたキャストは有効で...
-
20'(角度)の計算がわかりま...
-
複数桁10進数の*桁目だけを抽出...
-
信頼区間の1.96や1.65ってどこ...
-
C言語での引数の省略方法
-
do-while文が禁止される理由
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイル内に対して, ...
-
複数ファイルの同時読み込みの...
-
C言語でファイル読み書きを早く...
-
ファイル出力で改行を入れたい!
-
なぜCSQとCIP形式ではコ...
-
fopenでファイル名に、変数を使...
-
c言語でのfscanfについて
-
C言語にてXMLファイルから任意...
-
_popen() のエラー取得
-
数値のみ抽出(C言語)
-
ランダムアクセスができない
-
C言語でのCSVソートとデータ抽...
-
C言語 連番データの読み込み
-
ファイルの作成・書き込み・読...
-
fscanfでループしてしまう。
-
ファイルへの書込み処理が異常...
-
ファイルを読み込んで条件式を...
-
CSVファイルを読み込み構造体の...
-
C言語でセグメンテーションエ...
-
C言語について
おすすめ情報