windows7 64bitでcygwinを使用しています。
32bitを1つの組として、いくつかの組で構成されたバイナリデータがあります。
このバイナリデータにいくつの組があるのか調べるため、以下のようなソースを記述したのですが、うまくいきません。
どこを修正すればよろしいでしょうか。
御教授願います。
int main()
{
long long int i;
long long int hex[1];
long long int aaaa;
int bb;
int ret;
FILE * fp;
i = 1;
bb = 1;
for(;;){
fp = fopen("kimi.dat", "r");
bb = fread(&hex[1],4,i,fp);
aaaa = i;
i = aaaa + 1;
ret = fclose(fp);
if (bb != aaaa) {
printf("%lld\n",aaaa);
printf("%lld\n",i);
printf("%d\n",bb);
exit(1);
}
}
}
gcc -std=c99でコンパイルしました。
結果は
1431440333
1431440334
1
のように表示されました。
データファイルは900MB以上あります。
No.3ベストアンサー
- 回答日時:
forループ内で毎回ファイルオープンクローズを繰り返し
都度先頭からファイルを読もうとしているコードになっています
まともに動かしたいならhexのデータサイズはファイルサイズ分確保する必要があります
それ(データいくつ書かれてるか)求めるために書いてるコードとしては
本末転倒だし効率も悪いものとなっています
このままだともメモリ破壊しまくります(現状破壊されてるから処理が終わってる)
(実行環境によって結果は不定となります)
long long int hex[1]; を unsigned char hex[4];
bb = fread(&hex[1],4,i,fp); を bb = fread(&hex[0],4,1,fp);
if (bb != aaaa) { を if (bb != 1) {
に変更
for(;;){
fp = fopen("kimi.dat", "r");
の部分を
fp = fopen("kimi.dat", "rb");
for(;;){
に入れ替え(&ちょっと変更)
ret = fclose(fp);
if (bb != aaaa) {
の部分を
if (bb != 1) {
ret = fclose(fp);
に入れ替えればとりあえずはまともに
動くような気はする(※ 未確認)
ファイルサイズ求めて4で割るだけでもいい気がしました
No.4
- 回答日時:
単純に32bit型の値がファイルに何個含まれているか見るだけなら、こういう方法もあると思いますが、そういうわけにいかないんですよね?
% ls -l kimi.dat
-rwxr-xr-x 1 me mycomputer 900000000 Jan 1 1980 kimi.dat
% expr 900000000 / 4
それとも、32bitデータが連続して詰まっているファイルがあって、そのデータの出現回数を調べてますか?
そうすると、こんなプログラムになりますでしょうか?
#include <err.h>
#include <errno.h>
#include <sys/types.h>
#include <db.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
int
main(int argc, char *argv[])
{
DB *db;
DBT key, value;
FILE *fp;
uint32_t data, counter;
/* Use memory database instead of making own hashmap */
db = dbopen(NULL, O_RDWR|O_CREAT, 0700, DB_HASH, NULL);
fp = fopen(argv[1], "r");
if (fp == NULL) {
err(errno, "fopen");
}
while (!feof(fp) && fread(&data, sizeof(data), 1, fp) == 1) {
key.data = &data;
key.size = sizeof(data);
if (db->get(db, &key, &value, 0) == 0) {
counter = *((uint32_t*)value.data);
} else {
counter = 0; /* suspect no entry */
}
counter++;
value.data = &counter;
value.size = sizeof(counter);
db->put(db, &key, &value, 0);
}
fclose(fp);
/* print elements in the DB one by one */
while (db->seq(db, &key, &value, R_NEXT) == 0) {
printf("0x%x: %ld\n", *((uint32_t*)key.data), *((uint32_t*)value
.data));
}
db->close(db);
return 0;
}
自分でhashを作るのは面倒なのでBerkeleyDBを使いましたが...
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミングペーパーテスト 次の問題の実行結果を答えろ #include int x[ ] = { 1 2022/06/16 21:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ガンマ変換 C言語でプログラ...
-
複数ファイルの同時読み込みの...
-
CSVファイルの内容を構造体に格...
-
C言語でファイルの内容を strto...
-
CRC32の計算方法
-
ファイル出力で改行を入れたい!
-
【C言語】ファイルを読み込んで...
-
fopenでファイル名に、変数を使...
-
バイナリファイルの読み込み(C...
-
なぜCSQとCIP形式ではコ...
-
辞書順にソートしたいのですが...
-
c言語でのfscanfについて
-
エラーがわかりません、、
-
テキストファイル内に対して, ...
-
C言語 Segmentation fault
-
C言語 csv 配列
-
OpenGLによる描画内容をBMP出力
-
C言語でセグメンテーションエ...
-
バイナリファイルでの時刻表示
-
C言語にてXMLファイルから任意...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語でのfscanfについて
-
C言語でファイル読み書きを早く...
-
fopenでファイル名に、変数を使...
-
複数ファイルの同時読み込みの...
-
fgets( ) の返り値は何?
-
テキストファイル内に対して, ...
-
ファイルへの書込み処理が異常...
-
C言語にてXMLファイルから任意...
-
ファイル出力で改行を入れたい!
-
C言語でセグメンテーションエ...
-
エラーがわかりません、、
-
ガンマ変換 C言語でプログラ...
-
自己相関関数を求めるプログラ...
-
VisualStudioでのファイルの入...
-
同時にファイル読み込み 書き込み
-
c言語 ファイルから数字を読み...
-
大量の入力ファイルを扱うとき...
-
ファイルが読み込めない・・・
-
【C言語】ファイルを読み込んで...
-
a*(1-exp(-bx))+cの近似の方法
おすすめ情報