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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
艦長
記事: 17
登録日時: 10年前

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

#1

投稿記事 by 艦長 » 9年前

こんにちは
下記のようなプログラムを作りました。

コード:

#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

Rittai_3D
記事: 525
登録日時: 11年前

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

#2

投稿記事 by Rittai_3D » 9年前

上のプログラムで一つしか書き出していないからでは無いでしょうか?

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);
と一つだけ出力になっています。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#3

投稿記事 by softya(ソフト屋) » 9年前

int bufを配列にして2要素用意して、fread(&buf,sizeof(int),2,file);にしたした上でforループで回しながら、printf("%d¥n",buf);をすればお望みの動作が得られると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 9年前

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では表現できません)。
書く方法は、これをコピペするのが簡単だと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

艦長
記事: 17
登録日時: 10年前

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

#5

投稿記事 by 艦長 » 9年前

皆さん、お知恵を頂き、ありがとうございます。
早速、下記のコードで実験してみました。

コード:

#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でした。
何故こうなったのか分かりません。
ひょっとして、思い切り私のコードの解釈の勘違いなんでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#6

投稿記事 by softya(ソフト屋) » 9年前

読み込みが見当たりませんので、メモリの適当な値が表示されています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初級者
記事: 200
登録日時: 13年前

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

#7

投稿記事 by 初級者 » 9年前

ファイルのオープン
ファイルからの読み込み
ファイルのクローズ

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

艦長
記事: 17
登録日時: 10年前

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

#8

投稿記事 by 艦長 » 9年前

すみません。
私のミスに気づきました。
もう一度、考えてみます。

艦長
記事: 17
登録日時: 10年前

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

#9

投稿記事 by 艦長 » 9年前

出来ました!

コード:

#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;
}
しかし、まだ分からない部分もあるので、もっと自己研鑚したいと思います。
本当に、ありがとうございました。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

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

#10

投稿記事 by へにっくす » 9年前

たぶん動いちゃったんでしょうけど、コード的には間違ってます。
艦長 さんが書きました:

コード:

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

コード:

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

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#11

投稿記事 by softya(ソフト屋) » 9年前

すいません。私が犯人かも。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

フリオ

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

#12

投稿記事 by フリオ » 9年前

へにっくす さんが書きました:たぶん動いちゃったんでしょうけど、コード的には間違ってます。
艦長 さんが書きました:

コード:

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

閉鎖

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