こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

fread関数でわかりません。

fread関数で次のようにソースを記述しました。

FILE *fp;
char c[10];
int i;

fp = fopen ("./aaa.txt", "rb");

fread(c, sizeof(char)-1, 10, fp);

for(i = 0; i < 10; i++) printf("%02x ", *(c+i));

fclose(fp);
return 0;

aaa.txtの中には 0x1~0xAの10個の数字が記入されています。
cをint 型にすると正常に読み込めるのですが、char型だと
01 00 00 00 02 00 00 00 03 00
となってしまい、正常に読み込めません。

どうも、int型で読み込み、さらに引数 cにはchar *でキャストして渡しているように見受けられます。

Q1 どのようにしたら、char型で 10個一度に読み込めるようになるのでしょうか?
Q2 int型(32bit)なら、一度に4文字読み込むと思いますが、何故一文字ずつ読み込むことになるのでしょうか?

//getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。

投稿日時 - 2008-04-08 18:23:57

QNo.3932790

暇なときに回答ください

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

>aaa.txtの中には 0x1~0xAの10個の数字が記入されています。
>cをint 型にすると正常に読み込めるのですが、char型だと
>01 00 00 00 02 00 00 00 03 00
>となってしまい、正常に読み込めません。
それってテキストファイルではないような。
type aaa.txtとするか、メモ帳で開くとどうなりますか?

バイナリファイルとして、
0x00000001 0x00000002 0x00000003 .... 0x0000000A
と入っているのなら、fread一回でchar[10]に読み込むのは無理です。

さらに、
>//getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。
getcで一文字ずつ読み込む方法でもうまくいかないはずですよ。

投稿日時 - 2008-04-09 09:24:08

補足

stirling.exe で./aaa.txt で見たところ、
0x00000001, 0x00000002, ..., 0x0000000Aと記入されていました。
・・・aaa.txtを編集してしまったようです。
有難うございました。

投稿日時 - 2008-04-09 09:56:29

お礼

stirling.exe で./aaa.txt で見たところ、
0x00000001, 0x00000002, ..., 0x0000000Aと記入されていました。
・・・aaa.txtを編集してしまったようです。
有難うございました。

投稿日時 - 2008-04-09 10:02:04

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

Q1の回答
//MSDNより
size_t fread(void *buffer,size_t size,size_t count,FILE *stream );

第2引数は、サイズです。

fread(c, sizeof(char), 10, fp);


Q2の回答
> int型(32bit)なら、一度に4文字読み込むと思いますが
4文字読み込んでいるではく、4バイト読み込んでいます

投稿日時 - 2008-04-08 22:54:07

お礼

> 第2引数は、サイズです。
すいません。他の質問をみて変更してしまい、そのままにしていました。
#3の方への回答にあるように、aaa.txtをどこかで編集してしまったようです。
有難うございました。

投稿日時 - 2008-04-09 10:03:49

ANo.1

fread の第2引数, sizeof(char)-1 って 0 なんだけどなぁ....
なんで sizeof(char) (もしくは等価な 1) にしないんだろ?

投稿日時 - 2008-04-08 18:33:42

補足

他の質問を見て変えたのですが、そのままにして投稿してしまいました。
間違いでした。
私の質問への答えはありませんか?

投稿日時 - 2008-04-09 09:52:43