ページ 11

何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 10:37
by 艦長
こんにちは
下記のようなプログラムを作りました。

コード:

#include <stdio.h>

int main(void)
{
   int buf[]={10,100,1000,10000};
   FILE *file;
   file=fopen("test.dat","wb");
   fwrite(buf,sizeof(buf),1,file);
   fclose(file);
   return 0;
}
test.datをバイナリーエディターで開いてみると、テキスト通りの数値が書き込まれて成功しました。
そこで、今度はファイルからの読み込みのプログラムを、下記の通り書いてみました。

コード:

#include <stdio.h>

int main(void)
{
   int buf;
   FILE *file;
   file=fopen("test.dat","rb");
   fread(&buf,sizeof(buf),1,file);

   printf("%d¥n",buf);

   return 0;
}
で、実行結果は10になりました。
これも、テキスト通りでした。
しかし、fread(&buf,sizeof(buf),2,file);にしたら、10,100と出るのではないかと期待したのですが、実行結果は
10でした。
何故でしょうか?
初心者ですが、分かりやく教えて頂けますと幸いです。
尚、上記コードでは¥マークを半角でここで書くと、何故かバックスラッシュになってしまいます。
どうすれば、¥マークを半角で書けるのか、合わせて教えて頂けますと嬉しいです。

使用OS:WindowsXP
コンパイラー等:EasyIDEC ver0.0.9.0
出展:苦しんで覚えるC言語 P362

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 11:03
by Rittai_3D
上のプログラムで一つしか書き出していないからでは無いでしょうか?

fwrite参考 http://www9.plala.or.jp/sgwr-t/lib/fwrite.html
fread参考 http://www9.plala.or.jp/sgwr-t/lib/fread.html

をみると

fread:
ファイルfpからsizeバイトのデータをn個読み込み、bufに格納します。ファイル位置指示子を読み込んだデータバイト分進めます。エラーが発生した場合にはファイル位置指示子の値は不定です。
fwrite:
bufからファイルfpへsizeバイトのデータをn個書き込みます。ファイル位置指示子を書き込んだデータバイト分進めます。エラーが発生した場合にはファイル位置指示子の値は不定です。
とあります。上のプログラムでは

コード:

fwrite(buf,sizeof(buf),1,file);
と一つだけ出力になっています。

見当違いでしたらすいません。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 11:14
by softya(ソフト屋)
int bufを配列にして2要素用意して、fread(&buf,sizeof(int),2,file);にしたした上でforループで回しながら、printf("%d¥n",buf);をすればお望みの動作が得られると思います。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 11:27
by みけCAT
softya(ソフト屋) さんが書きました:int bufを配列にして2要素用意して、fread(&buf,sizeof(int),2,file);にしたした上でforループで回しながら、printf("%d¥n",buf);をすればお望みの動作が得られると思います。

それだと10,100とは出ませんね。

コード:

int buf[2];
int i;
/* 読み込み */
for(i=0;i<2;i++)printf("%s%d",i==0?"":",",buf[i]);
putchar('\n');
艦長 さんが書きました:尚、上記コードでは¥マークを半角でここで書くと、何故かバックスラッシュになってしまいます。
どうすれば、¥マークを半角で書けるのか、合わせて教えて頂けますと嬉しいです。
ブラウザのフォントを適切なものに設定してください。
または、全角の¥と同様にC言語のエスケープシーケンスとしては使えませんが、半角の円「¥」という記号もUnicodeにあります(Shift_JISでは表現できません)。
書く方法は、これをコピペするのが簡単だと思います。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 14:03
by 艦長
皆さん、お知恵を頂き、ありがとうございます。
早速、下記のコードで実験してみました。

コード:

#include <stdio.h>

int main(void)
{
	int buf[2];
	int i;
	/* 読み込み */
	for(i=0;i<2;i++)printf("%s%d",i==0?"":",",buf[i]);
	putchar('\n');

	return 0;
}
しかし、結果は1245120,4198639でした。
何故こうなったのか分かりません。
ひょっとして、思い切り私のコードの解釈の勘違いなんでしょうか?

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 14:12
by softya(ソフト屋)
読み込みが見当たりませんので、メモリの適当な値が表示されています。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 14:13
by 初級者
ファイルのオープン
ファイルからの読み込み
ファイルのクローズ

は、どこへ行ってしまったのですか?

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 14:28
by 艦長
すみません。
私のミスに気づきました。
もう一度、考えてみます。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 14:50
by 艦長
出来ました!

コード:

#include <stdio.h>

int main(void)
{
	int buf[2];
	int i;
	FILE *file;
	
	file=fopen("test.dat","rb");
	fread(&buf,sizeof(buf),1,file);
	
	/* 読み込み */
	for(i=0;i<2;i++)printf("%s%d",i==0?"":",",buf[i]);
	putchar('\n');

	fclose(file);
	
	return 0;
}
しかし、まだ分からない部分もあるので、もっと自己研鑚したいと思います。
本当に、ありがとうございました。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 15:25
by へにっくす
たぶん動いちゃったんでしょうけど、コード的には間違ってます。
艦長 さんが書きました:

コード:

int buf[2];
fread(&buf, sizeof(buf), 1, file);
の&bufは間違いです。変数が配列の場合、&はつけないでよいです。

コード:

fread(buf, sizeof(buf), 1, file);// 配列の場合、それ自体がポインタとして扱える
&をつけるとしたら

コード:

fread(&buf[0], sizeof(buf), 1, file);// 先頭のアドレスという明示
としてほしいですね。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月06日(日) 15:58
by softya(ソフト屋)
すいません。私が犯人かも。

Re: 何故、書き込んだ数値が出て来ないのでしょう?

Posted: 2014年7月07日(月) 11:43
by フリオ
へにっくす さんが書きました:たぶん動いちゃったんでしょうけど、コード的には間違ってます。
艦長 さんが書きました:

コード:

int buf[2];
fread(&buf, sizeof(buf), 1, file);
の&bufは間違いです。変数が配列の場合、&はつけないでよいです。
間違いじゃないです。
読み込み処理を関数にして、引数で配列を渡す場合は注意が必要ですが、
質問の例では、buf なら配列 buf の先頭要素へのポインタ、&buf なら配列 buf へのポインタが fread に渡されるので、
どちらでも問題ありません。