プログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこ

プログラム

#1

投稿記事 by ざこ » 16年前

int main(void)
{
FILE *fp;
  char buf[100];
  short buf1;

  file=fopen("ファイル名","rb");
  fread(&buf,sizeof(char),8,file);
  fread(&buf1,sizeof(buf1),1,file);

  fclose(file);
  
  printf("%d",buf1);
  return 0;
}
バイナリエディタに関して学習してるのですがすっかり混乱してます。
とりあえずプログラムに書かれてることがどういうことかわからないと話にならないと思いますので
上記のプログラムの意味を教えていただけませんか?

Mist

Re:プログラム

#2

投稿記事 by Mist » 16年前

まずfreadについて理解してください。

ファイルから size バイトのデータを n 個読み込み
【書式】
#include <stdio.h>
size_t fread(void *buf, size_t size, size_t n, FILE *fp);

【説明】
ファイルfpからsizeバイトのデータをn個読み込み、bufに格納します。ファイル位置指示子を読み込んだデータバイト分進めます。エラーが発生した場合にはファイル位置指示子の値は不定です。

【引数】
void *buf : 読み込みデータ格納先のポインタ
size_t size : 読み込みデータのバイト長さ
size_t n : 読み込みデータの数
FILE *fp : FILEポインタ

【戻り値】
正常時 : 読み込んだデータ個数(バイトではありません)
ファイル終了時及びエラー時 : nより小さな値


で、プログラムですが
> fread(&buf,sizeof(char),8,file);
ファイルから1バイトとずつ8回データを読む。
読み込んだデータをbufに書く。
ただし、このプログラムはバグっています。
正しくは
fread(buf,sizeof(char),8,file); // &いらない

> fread(&buf1,sizeof(buf1),1,file);
ファイルから2バイトとずつ1回データを読む。
読み込んだデータをbuf1に書く。

両方で10バイトリードしていますのでファイルに10バイト以上のデータがあることが前提です。

ざこ

Re:プログラム

#3

投稿記事 by ざこ » 16年前

> fread(&buf1,sizeof(buf1),1,file);
ファイルから2バイトとずつ1回データを読む。
読み込んだデータをbuf1に書く

この2バイトとはどこから出てきたものなのでしょうか?
お手数ですが教えて下さい。

ざこ

Re:プログラム

#4

投稿記事 by ざこ » 16年前

すいません。おそらくバイトの長さが2?だからなのだと思うのですが
sizeof(char)
sizeof(buf1)
がどうなってるのか教えて下さい。

Mist

Re:プログラム

#5

投稿記事 by Mist » 16年前

1から10まで回答するのは丸投げ臭いですし、sizeofはC言語の基礎ですから「sizeof演算子」でググってください。
いろいろな例がありますのでそれらで勉強してください。


余談
short buf1;
sizeof(buf1)
のサイズは厳密に言うと2バイトではないかもしれません。
環境に依存しますが、VCとかBCCであれば2です。

ざこ

Re:プログラム

#6

投稿記事 by ざこ » 16年前

なるほど
charのサイズが1で
shortのサイズが2
ということがわかりました。ありがとうございました。

通りすがり

Re:プログラム

#7

投稿記事 by 通りすがり » 16年前

fopenの使い方、fcloseの使い方、freadの使い方、どれをググっても大量に説明が出てきます。
複雑な関数の使い方ならまだしも、質問されたコードは基本中の基本です。
わからないプログラムがあったとき、「はい、誰か説明して」と言う前に自分で調べましょう。
「調べるのが面倒だし、誰かに聞いた方が早い」と思っていると成長しません。

ざこ

Re:プログラム

#8

投稿記事 by ざこ » 16年前

単純に語句がわからなかったんじゃなくイメージができなくて混乱したんです。
だからどういうプログラムなのかイメージしてから分解しようかと。実際にMistさんの丁寧な
説明がなければわからなかったと思います。バイトの長さ の認識が曖昧だったようです。
助言ありがとうございます。

Dixq (管理人)

Re:プログラム

#9

投稿記事 by Dixq (管理人) » 16年前

ゲームプログラミングの館にもセーブデータの作り方としてfreadの使い方説明しています。
http://dixq.net/g/#t0
よければ参考にして下さい。
このように、構造体にはいっているデータがまるまるそのまま書き出せ、
読み込むときも書き出したときのままの状態で読み込めるので便利です。

閉鎖

“C言語何でも質問掲示板” へ戻る