
新年早々、初歩的な質問で申し訳ありません。
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイル内に対して, ...
-
CGIコンパイルエラーについ...
-
C言語にてXMLファイルから任意...
-
C言語におけるファイル読み込み...
-
C言語でファイル読み書きを早く...
-
VisualStudioでのファイルの入...
-
_popen() のエラー取得
-
エラーがわかりません、、
-
複数ファイルの同時読み込みの...
-
C言語でファイルの内容を strto...
-
c言語でのfscanfについて
-
Winsockの通信処理にてファイル...
-
csvfファイルの1行目と3行目を...
-
ファイル出力で改行を入れたい!
-
fopenでファイル名に、変数を使...
-
fscanfで格納された変数がおか...
-
C言語を用いて、csvファイル内...
-
fscanfでループしてしまう。
-
ガンマ変換 C言語でプログラ...
-
テキストファイルをバイナリフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
複数ファイルの同時読み込みの...
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
c言語でのfscanfについて
-
ファイルへの書込み処理が異常...
-
ファイル出力で改行を入れたい!
-
fscanfでループしてしまう。
-
C言語にてXMLファイルから任意...
-
テキストファイル内に対して, ...
-
datファイルの読み込み
-
ファイルに行番号を追加
-
大量の入力ファイルを扱うとき...
-
辞書順にソートしたいのですが...
-
InternetReadFileを使ったファ...
-
C言語 連番データの読み込み
-
C言語におけるファイル読み込み...
-
数値のみ抽出(C言語)
-
簡易grep関数ができません。助...
-
VisualStudioでのファイルの入...
-
fgets( ) の返り値は何?
おすすめ情報