- ベストアンサー
バイナリファイルでランダムアクセスを行う方法
- バイナリファイルを使用してランダムアクセスを行う方法を初心者に分かりやすく解説します。
- サンプルコード内のfread関数の引数について、初心者向けに説明します。
- サンプルコードを使って、指定された番号のデータを読み込む方法を解説します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
コンパイルした時にwarningは出ていませんでしたか。 > #define NUM 5 これがあるので > なぜ5のポインタなのか と疑問に思っているようですが。 「NUM」はどこにも使われていませんね。 「num」とは別物です。 define文、グローバル変数、ローカル変数をもう一度調べなおしてみてください。
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
手遅れかもしれんけど.... 「確かにご指摘のとおりNUMとnumは別物ですね。(誤植でしょうかね。メールで著者に問い合わせてみます)」 の「誤植」というのは「何を何と間違えた」と思っているんだろう. そして, 「確かにご指摘のとおりNUMとnumは別物ですね。」 と書いているにもかかわらず 「読み込む領域へのポインタ=&num=&NUM=&5と解釈し」た理由がさっぱりわからん.
補足
あなたはそもそも初心者を助けようなどとはみじんも考えていないでしょう?出だしからいきなり「手遅れかもしれんけど...」手遅れってどういういみですか?こういう非人間的なことをさらっと言って、一生懸命理解しようとして「お願いですから教えてください」と頭を下げている初心者をつぶしにかかるような人ですから。 手厳しいことをいっても最後には救いの手を差し伸べてくれる、そういう人には正直あたまがさがります。きちんとお礼も述べます。だが、あなたは違う。上記内容は回答と呼ぶにはほど遠い。回答する資格はない。こういう形でストレス発散するのは恥ずべき行為だと自覚すべきです。やめてください。はっきりいって悪質です。
- saijyo_739
- ベストアンサー率53% (119/222)
著者とかでてきましたが何かのテキストですか。 色々依存しているプログラムですよ。(トラブルの元となるので避けた方が良さそうな方法) ※問題に整数を32ビットとして扱えだのバイトオーダはどうするだの限定してないと問題自体が正しくないとも言えそう。 この問題でデータの表記が質問に書かれている内容だとデータファイル作るにも困りそうだし。 ※直前に作ったプログラムで書いているデータなのかな。バイナリエディタやデータダンプ可能なソフトで内容を確認して見ましょう。 > 下から5行目のfreadの一つ目の引数 &num です。 > fread(&num, sizeof(int), 1, fp); fread()の最初の引数が読み込んだデータを格納するアドレスだから、そのプログラムではint型変数numに読み込んだデータを保存したいのでそのアドレスを指定しています。 入出力は失敗する事も考えられるので、返り値は確認すべきです。 if( 1 == fread( &num, sizeof( num ), 1, fp ) { printf( "値を正常に読み出せました。\n" ); } else { printf( "値が正しく読み出せませんでした。\n" ); } text.binは 80 0 0 0 60 0 0 0 22 0 0 0 50 0 0 0 75 0 0 0 なのでしょうね。intel のx86, Pentium, Core系の32bit CPUの場合。 ※ 質問の表記では改行入りのテキストファイルにしか見えない。
お礼
ありがとうございます。ですが正直、初歩の初歩ABCの質問ででこういうつっこみをされると初心者はたいへん困り悩みます。
- kmee
- ベストアンサー率55% (1857/3366)
int num ; と宣言すると、num が記憶されている領域(アドレス)は &num です。 > scanf("%d", &i); では悩まないんですか?同じアドレス演算子が使われてますよ?
お礼
ありがとうございます。もうすこしヒントを多く出して下されば気づいたかもしれません。
- koi1234
- ベストアンサー率53% (1866/3459)
本題とそれますが text.bin の中身って 現物そのものですか? 動かした時またなぜこんな値 ってなりそうな中身ですが (ただのテキストファイルじゃないか と) 多分 1番目のデータで80 2番目のデータで60 といった動きをさせたいんでしょうが ファイルの中身が本当にこのままでコードもこのままなら 結果はそうはなりません
補足
初心者が初歩的なところでつまずいてこまっていてなんで本題とそれちゃうんですか?よけい混乱するだけです。
- notnot
- ベストアンサー率47% (4900/10358)
「5のポインタ」というのが意味不明ですが、 関数を呼び出して引数の変数に値を入れてもらう時には、変数のアドレスを渡す必要があるので、&をつけます。 「ここに入れて」という「ここ」を示すためです。
お礼
ありがとうございます。
補足
X-Codeではwarningは出ておりませんでした。 確かにご指摘のとおりNUMとnumは別物ですね。(誤植でしょうかね。メールで著者に問い合わせてみます)著書には、 fread(読み込む領域へのポインタ、データサイズ、個数、ファイルポインタ); と構文の解説がありましたので、 読み込む領域へのポインタ=&num=&NUM=&5と解釈し、ポインタの5?う~んどういうことなんだろう、と迷ってる次第です。 なにかお気づきな点がございましたらご教授ください。