ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:whatsnew 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 で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。
質問投稿日時:08/04/08 18:23
質問番号:3932790
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:titokani >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で一文字ずつ読み込む方法でもうまくいかないはずですよ。
種類:補足要求
どんな人:専門家
自信:自信あり
回答日時:08/04/09 09:24
回答番号:No.3
この回答への補足stirling.exe で./aaa.txt で見たところ、
0x00000001, 0x00000002, ..., 0x0000000Aと記入されていました。
・・・aaa.txtを編集してしまったようです。
有難うございました。
この回答へのお礼stirling.exe で./aaa.txt で見たところ、
0x00000001, 0x00000002, ..., 0x0000000Aと記入されていました。
・・・aaa.txtを編集してしまったようです。
有難うございました。

回答

良回答10pt

回答者:takoashi 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バイト読み込んでいます
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:08/04/08 22:54
回答番号:No.2
この回答へのお礼> 第2引数は、サイズです。
すいません。他の質問をみて変更してしまい、そのままにしていました。
#3の方への回答にあるように、aaa.txtをどこかで編集してしまったようです。
有難うございました。

回答

 

回答者:Tacosan fread の第2引数, sizeof(char)-1 って 0 なんだけどなぁ....
なんで sizeof(char) (もしくは等価な 1) にしないんだろ?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/08 18:33
回答番号:No.1
この回答への補足他の質問を見て変えたのですが、そのままにして投稿してしまいました。
間違いでした。
私の質問への答えはありませんか?
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示