• ベストアンサー

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 で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.3

>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で一文字ずつ読み込む方法でもうまくいかないはずですよ。

whatsnew
質問者

お礼

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

whatsnew
質問者

補足

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

その他の回答 (2)

  • takoashi
  • ベストアンサー率39% (21/53)
回答No.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バイト読み込んでいます

whatsnew
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

whatsnew
質問者

補足

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

関連するQ&A