ページ 12

ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 06:17
by み~
おはようございます!!書き込みが多くなったので新たにスレをたてさせていただきます!!

毎日毎日、同じような質問に親切にアドバイスをくださる皆様にはものすごく感謝しております!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:28
by み~
#include <stdio.h>
#define NUM 5
int main(void) {
	char no[NUM] = {1,2,3,4,5};
	int i ;
	FILE *fp;
	fp = fopen("test.txt","w");
	if(fp == NULL){
		return 1;
	}else{
		printf("open\n");
	}

	for(i = 0; i < NUM; i++) {
		fgets(&no,sizeof(no),fp );
		
	}

	for(i = 0; i < NUM; i++) {
		fprintf(fp,"%d\n", &no);
	}
	fclose(fp);
	return 0;
}

ファイルには
1245048
1245049
1245050
1245051
1245052と書き込まれてしまっている・・・。

fgets(&no,sizeof(no),fp );の所が違うの?&を取ると警告でるし・・・・

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:31
by み~
やっぱり二次元配列にするべきなのですかね??

一次元でもできるようにしたいのですが・・・何か方法はありますか??

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:39
by miyaza
キーボードから入力して書き込みたいのですか?
それとも配列の初期値12345を書き込みたいのですか?
後者ならばfgets()を使う必要はありません。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:45
by み~
miyazaさんおはようごうざいます!!

初期値を書き込みたいのです。。キーボード入力しないならfgets()はいらないと気づいてfgets()部分
をけしたのですが、ダメでした。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:49
by miyaza
12345と出力されれば良いのですか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:51
by み~
書き込まれたファイルを見ると、意味不明な文字とかが書かれているのです・・・。

fprintf(fp,"%d\n", &no);の部分なんですけど、%dじゃなくて%sですかね。。char no[NUM]となって
いることだし・・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:51
by miyaza
fprintf()の&を取ればおそらく大丈夫です。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:52
by み~
>>12345と出力されれば良いのですか?
そうです・・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:53
by むつ
前日のソースでは fprintf(fp,"%d\n", &no); において
noとしていましたよね。

エディタは何をお使いでしょうか。
タイプミス防止の為、「 & 」に色を付けてみてはいかがでしょうか。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:54
by み~
>>fprintf()の&を取ればおそらく大丈夫です。

これでできましたよ!!

でも、どうしてもコンソールから入力させて一次元でもできるようになりたいですね~。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:57
by miyaza
何で一次元にこだわるのですか?
文字列を格納するなら二次元の方が管理しやすいと思います。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 08:58
by み~
むつさんおはようございます!!

なんというか&の使い方がよく分からないのです。。
ポインタの所とかよんでいるのですが・・・。

ファイルに読み書きする際どのようなときに付けるのか付けないのか・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 09:01
by み~
miyazaさん。。
それなら二次元の方がいいですね。。了解です!!

でも、上のコードを今度二次元にしてみたのです。。そしたらやはり思ったようには書き込まれていなかった。。
include <stdio.h>
#define NUM 5
int main(void) {
	char no[NUM][NUM] = {1,2,3,4,5};
	int i ;
	FILE *fp;
	fp = fopen("test.txt","w");
	if(fp == NULL){
		return 1;
	}else{
		printf("open\n");
	}

	//for(i = 0; i < NUM; i++) {
		//fgets(&no,sizeof(no),fp );
		
	//}

	for(i = 0; i < NUM; i++) {
		fprintf(fp,"%d\n", no);
	}
	fclose(fp);
	return 0;
}

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 09:08
by miyaza
今回は二次元配列にする必要がありません。
あつかっているのは12345だけなので二次元にしても意味がありません。

言葉がたりませんでした、複数の文字列を扱うときには二次元配列の方がいいというはなしです。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 09:10
by み~
miyazaさん、そうですか。了解しました。。

もう少しいろいろ試した見ます!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 09:11
by むつ
イージーミスが多いですよ。
とりあえずコーヒー飲んで落ち着こう!

/* */ // & , . " ' {} = これらの文字に色を付ければ、タイプミスは防げると思いますよ。

それと、前日のスレに自分が掲示した読み書きのサンプルを触ってみてください。
色々とヒントを詰め込んだつもりです。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 09:28
by み~
むつさん!!了解です!!

ちなみに今ファイルからの読み込み成功しました!!!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 11:13
by み~
今、あらたなプログラム書いてます!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 11:55
by み~
[/pre]
#include <stdio.h>
#define NUM 3

int main(void) {
char no[NUM][10];
char name[NUM][20];
int point;
int i;

FILE *fp;
fp = fopen("test.txt","w");
if(fp = NULL) {
return 1;
}else{
printf("file open\n");
}

for(i = 0 ; i < NUM; i++) {
printf("NO:");
fgets(no,sizeof(no),stdin);
printf("NAME:");
fgets(name,sizeof(name),stdin);
printf("点数:");
scanf("%d",&point);
}

for(i = 0; i < NUM; i++) {
fprintf(fp, "%d\n",no);
fprintf(fp, "%s\n", name);
fprintf(fp , "%d\n", point);
}

fclose(fp);
return 0;
}

[/pre]
うまく書き込めないです。
なぜかno入力が飛ばされる

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:13
by miyaza
とりあえずfpのエラー処理

if(fp=NULL)からif(fp==NULL)に直してください。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:18
by miyaza
書き込み部分
scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:21
by keichan
これかな?
printf("点数:");
scanf("%d",&point);

printf("点数:");
scanf("%d ",&point);

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:35
by み~
なぜか二回目のループの時だけnoがとばされる・・・なぜ??

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:36
by miyaza
3人分の点数を入れるならpointも3つ確保してください。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:41
by miyaza
> なぜか二回目のループの時だけnoがとばされる・・・なぜ??
入力バッファをクリアしていないからだと思います。たぶんですが。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:42
by み~
ダメです・・・・。
#include <stdio.h>
#define NUM 3

int main(void) {
	char no[NUM][10];
	char name[NUM][20];
	int point[NUM];
	int i;

	FILE *fp;
	fp = fopen("test.txt","w");
	if(fp == NULL) {
		return 1;
	}else{
		printf("file open\n");
	}

	for(i = 0 ; i < NUM; i++) {
		printf("NO:");
		fgets(no,sizeof(no),stdin);
		printf("NAME:");
		fgets(name,sizeof(name),stdin);
		printf("点数:");
		scanf("%d",&point);
	}

	for(i = 0; i < NUM; i++) {
			fprintf(fp, "%d\n",no);
			fprintf(fp, "%s\n", name);
			fprintf(fp , "%d\n", point);
	}

	fclose(fp);
	return 0;
}

noだけがとばされますね・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:45
by miyaza
入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:46
by
保存時の時を考えて統一した方がいいのでは?

for(i = 0 ; i < NUM; i++)
{
  printf("NO:");
  fgets(no,sizeof(no),stdin);
  printf("NAME:");
  fgets(name,sizeof(name),stdin);
  printf("点数:");
  scanf("%d", &point);
}

  ↓

for(i = 0 ; i < NUM; i++)
{
  printf("NO:");
  scanf("%s", &no);
  printf("NAME:");
  scanf("%s", name);
  printf("点数:");
  scanf("%d", &point);
}

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:49
by み~
>>入力バッファに残ったものが次にfgets()が来たときfgts()に入れられてこちらの入力が飛ばされてしまいます。
だからバッファをクリアして下さい。


クリアとはどのようにするのですか??

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 13:56
by miyaza
scanf()の下にfflush(stdin)と追加してください。
とりあえず書き込めるようになります。

fprintf(fp,"%d",no);
から
fprintf(fp,"%s",no);
に変更

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:05
by み~
コンソールから入力したのにファイルができてないです。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:10
by miyaza
なにも書き込まれていないのでは無くファイルが出来ていないということですよね?

fopen()からの処理に問題がありませんか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:11
by み~
#include <stdio.h>
#define NUM 3

int main(void) {
	char no[NUM][10];
	char name[NUM][20];
	int point[NUM];
	int i;

	FILE *fp;
	fp = fopen("test.txt","w");
	if(fp == NULL) {
		return 1;
	}else{
		printf("file open\n");
	}

	for(i = 0 ; i < NUM; i++) {
		printf("NO:");
		fgets(no,sizeof(no),stdin);
		printf("NAME:");
		fgets(name,sizeof(name),stdin);
		printf("点数:");
		scanf("%d",&point);
		fflush(stdin);
	}

	for(i = 0; i < NUM; i++) {
			fprintf(fp, "NO:%s\n",no);
			fprintf(fp, "NAME:%s\n", name);
			fprintf(fp , "POINT:%d\n", point);
	}

	fclose(fp);
	return 0;
}

コードです

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:17
by み~
なんでファイルができないのでしょう??
コードおかしいのかな??

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:17
by miyaza
こちらで確認してみましたtest.txtは作成されていました。

しかしpointの値がおかしかったです。

fprintf(fp , "POINT:%d",point);

と直してください。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:19
by
ファイルに書き込まれてますよ?

点数を書き込む処理を
 fprintf(fp , "POINT:%d\n", point);
に変更しましょう。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:23
by み~
了解です!!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:36
by GPGA
み~さんの環境がVC6なので、fflushで入力バッファをクリアすることができていますが
Cの規格では、入力ストリームに対するfflushは未定義であるため、推奨されません。

MSDNでは、fflushを使用して入力ストリームをクリアするサンプルがあり
その行のコメントは以下のようになっています。

fflush on input stream is an extension to the C standard


また、この件は以前この掲示板の話題に上がっていますので、ご参考ください。 http://www.play21.jp/board/formz.cgi?ac ... q&rln=4467

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:40
by み~
GPGAさん、了解です!!
#include <stdio.h>
#define NUM 3

int main(void) {
	FILE *fp;
	char no[NUM][10];
	char name[NUM][20];
	int point[NUM];
	int i;

	
	fp = fopen("test.txt","r");
	if(fp == NULL) {
		return 1;
	}else{
		printf("file open\n");
	}

	for(i = 0; i < NUM; i++) {
		fscanf(fp,"%*%s",&no);
		fscanf(fp,"%*%s",&name);
		fscanf(fp,"%*%d",&point);
	}

	for(i = 0; i < NUM; i++) {
		printf("%s\n",no);
		printf("%s\n",name);
		printf("%d\n", point);
	}

	fclose(fp);

	return 0;
}

読み取れないんですけど。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 14:59
by み~
fscanf(fp,"%*%s",&no);
fscanf(fp,"%*%s",&name);
fscanf(fp,"%*%d",&point);の部分を%*を取ればできたのですが、最後のpointだけ正常に
読み取れないです・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:08
by miyaza
fflush()のことは知りませんでした。すいません。よく調べてから書き込むべきでした。

int型で読めないのなら文字列として読み取って見るのも手かもしれません。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:16
by GPGA
今回は POINT: と数値の間にスペースが無いんですね。
そうすると

× fscanf(fp, "%*%d", &point);
○ fscanf(fp, "%*[^0-9]%d ", &point);

といったところでしょうか。
 

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:17
by
どのように表示をしたいのでしょうか?

NO:1
NAME:1
POINT:1
 ・
 ・
 ・

それとも
1
1
1

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:19
by み~
文字列としてもむりでした。例外がおきてしまいました。。

>>× fscanf(fp, "%*%d", &point);
○ fscanf(fp, "%*[^0-9]%d ", &point);

もっと簡単なやりかたないですかね??まだまだ私にはこのようなやり方は
考え出せそうもないので・・・・。レベルにあったやりかたで。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:25
by miyaza
> 文字列としてもむりでした。例外がおきてしまいました。。


変数
char point[NUM][10];

読み込み
fscanf(fp,"%s",&point);

表示
printf("%s\n", point);

という感じで修正しましたか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:25
by
変数pointをint型からchar型に直しましたか?
int型で文字列は読めませんよ。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:29
by バグ
『何でもかんでも教えてもらえばいいや』という姿勢は如何なものかと思いますよ。

自分で調べたり、考えたりした事でないと、本当の意味で身に付かないと思います。

失礼かもしれませんが、ファイル云々よりも、もっと前の段階を参考書などを読んで理解を深めてから、取り組んだ方がいいのではないでしょうか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 15:35
by むつ
 今、一つのファイルで【データの蓄積】と【最新データの確認】と両方をこなしています。
ですから、fscanf()で複雑な事をしなくてはいけなくなります。

■蓄積用ファイルには、NO:、NAME:、POINT:等とつけないで保存する。

■データの最新データを確認したい場合は、fopen "r"で読み込んだ後、
printf()でNO:、NAME:、POINT:と書式付でコンソールに表示するか、
または、別の確認用ファイルに出力してください。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 16:07
by み~
miyazaさん、※さん、むつさんアドバイスありがとうございます!!
読み込みが無事できました!!!

バグさん。。おっしゃる通りです。。もう一度基本的なことから勉強してみます!!
ただ、ファイルに関してはなぜか苦手意識がついてしまったみたいで自信が持てないのです。。
不安で不安で仕方ないのです。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 21:56
by み~
何回やってもコンパイルエラーが出てしまいます。。
include <stdio.h>

int main(void) {
	int a[10] = {1,2,3,4,5,6,7,8,9,};
	int i;
	FILE *fp;
	fp = fopen("test1.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++) {
		fwrite(&a,sizeof(a),1,fp);
	}
	for(i = 0; i <10; i++){
		fprintf("%d",a,fp);
	}
	printf("OK");

	
	fclose(fp);
	return 0;
}

エラー内容:1行目、宣言の構文エラーと出ます。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:02
by 組木紙織
#include

落ち着いて考えてください

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:08
by み~
組木紙織さん!!ありがとうございます!!

コンパイルはできたのですが、ファイルができないのです・・・。ず~と考えてるのですが・・限界です。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:15
by み~
たった今、コンパイル、実行できましたが、読み込みができないですね~。
読み込んでいるときにエラーになってしまいます。。
#include <stdio.h>

int main(void) {
	int a[10];
	int i;
	FILE *fp;
	fp = fopen("test1.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	
		fread(&a,sizeof(a),1,fp);
	

	printf("%d",&a);
	fclose(fp);
	return 0;
}

読み込みのコードですが、どっか変ですかね??

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:25
by 組木紙織
考えるだけでなくコンパイラの警告もきちんと考えましょう。
私のVC++での警告です
/***************/
警告 1 warning C4996: 'fopen' が古い形式として宣言されました。
警告 2 warning C4313: 'printf' : 書式文字列内の '%d' が引数 1 ('int *__w64 ' 型) と競合
警告 3 warning C4700: 初期化されていないローカル変数 'i' が使用されます

/************/
1は無視してもほとんどかまわないので2と3の警告を消すように考えてみてください。

コンパイラは頭いいので、頼りになります。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:29
by み~
組木紙織さんありがとうございます。。
ただ、私の場合コンパイルはコンソールでbcc32とかでやってるもんで、そこまで出てきていませんでした。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:42
by み~
警告3は分かったけど、警告2が分からない。。
警告3はfor文作るだけですよね??

実行しても、しっかりと読み取れていない。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:46
by 組木紙織
警告3はfor文というより、初期化をしてください!!!。ということです。
警告2はprintf()の引数が変だよと言っています。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 22:56
by み~
こんな感じですけど、読み取れないですね・・・?
#include <stdio.h>

int main(void) {
	int a[10];
	int i;
	
	FILE *fp;
	fp = fopen("test1.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++){
		fread(&a,sizeof(a),1,fp);
	}
	

	printf("%d",a);
	fclose(fp);
	return 0;
}

初期化?? int i = 0;ぐらいしか思い浮かばないです。
引数っていったら&を付けるか付けないかだと思うのですが・・・。
何が違うのだろ・・・?

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 23:05
by 組木紙織
これforループで十回連続で読み込んで、その最後+1の読み込みを返しています。

配列を使わずに作り直してみたらどうですか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 23:35
by み~
やっぱり正しく読み取れなかったのですか??
for文を使わないでですか・・・。思いつかないですね~。。どうすればいいか・・・
テキストなんか見ても、for使ってますし・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 23:43
by 組木紙織
書き方が悪かった。。

始めのひとつだけの読み込み&画面への表示をしてみたらどうですか?
というつもりだったのですが。

先ほどのコードを見てみると
for(i = 0; i < 10; i++){
		fread(&a,sizeof(a),1,fp);
	}
         /*
          ここではiの値は何ですか?
         */
     printf("%d",a);

Re:ファイルの読み込み書き込み

Posted: 2007年3月16日(金) 23:49
by み~
組木紙織さん。
了解です!!試してみます!!
明日、結果を書きます!!
夜遅くまでありがとうございました!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 08:31
by み~
こんな感じですけど、読み取れないですね・・・?

#include <stdio.h>

int main(void) {
int a[10];


FILE *fp;
fp = fopen("test1.txt","rb");
if(fp == NULL) {
return 1;
}else{
printf("open\n");
}


fread(&a[1],sizeof(a[1),1,fp);



printf("%d",a[1]);
fclose(fp);
return 0;
}

一つづつ読み込ませてのですがダメでした。
for文の所消してfread(&a[1],sizeof(a[1]),1,fp);とすればいいのですよね??

それとも書き込みがしっかりできていないのですかね?

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 09:43
by み~
元の書き込み用コードです。。
#include <stdio.h>

int main(void) {
	int a[10] = {1,2,3,4,5,6,7,8,9};
	int i;
	FILE *fp;
	fp = fopen("test2.txt","wb");
	if(fp == NULL){
		return 1;
	}else{
		printf("open\n");
	}
	for(i = 0; i < 10; i++){
		fwrite(&a,sizeof(a),1,fp);
	}
	fclose(fp);
	return 0;
}

fwrite()の部分なのですが、aとするとコンパイルエラーで、パーラメター'_ptr'
はconst void * 型として定義されているのでint型は渡せないと出ます。
配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
&をつけるのでしょうか?

テキストファイルは一応できていました。中身は、£Γというような意味不明の記号みたいなものがありました。

もしかしたら、読み込みが正常にできないというのは書き込みの段階で間違っているのでしょうか??

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:12
by miyaza
> 配列の場合だと&を付けなくても、配列の先頭要素へのポインタとなるのになぜ
配列の要素iが変化していっているので、個々の要素にアクセスするためには&が必要です。
先頭アドレスというのはa[0]のアドレスのことです。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:21
by み~
miyazaさんおはようございます!!
&はそういうことだったのですか!!スッキリしました。。

ただ、まだバイナリファイルの読み書き苦戦中です。。
普通のファイルの読み書きはだいぶできるようになってきました。。

上のコードですけど、特に怪しいところはありませんよね??

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:21
by miyaza
作成されたバイナリファイルの内容は1234567890となっていました。
これで問題ないなら書き込み部分に原因はありません。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:28
by み~
最後の0って??なんであるのでしょう??

自分も今、偶然読み込みができたのですよ!!
そしたら、最後に0が・・・。一体なぜ??

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:32
by miyaza
書き込みする値を初期化するところに問題があります。
簡単な原因ですからそこを修正して下さい。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:34
by み~
miyazaさん!!できました!!成功です!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:46
by み~
先ほど、読み書きできたバイナリファイルを今度はランダムアクセスで読み取ろうと思ったのですが、
やはり失敗しちゃいますね~。読み込むと1245028などとでてきてしまいます。

コードはコンパイルも警告もないのですが・・・。
#include <stdio.h>

int main(void) {
	int a[10];
	
	FILE *fp;
	fp = fopen("test2.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
		fseek(fp,4,SEEK_SET);
		fread(&a,sizeof(a),1,fp);
	

	printf("%d",a);
	fclose(fp);
	return 0;
}

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 10:52
by バグ
printf("%d",a);

これが原因ではないでしょうか?
aの先頭アドレスを表示しているようです。

printf("%d",a[n]);

のようにしないと変数の中身は見ることが出来ないです。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 11:00
by み~
バグさんおはようございます!!

printf("%d",a[n]);とすると、最初にint = n;と宣言してやったのですが、実行するとエラーに
なってしまいますね。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 11:02
by miyaza
nに値は、入っていますか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 11:47
by み~
nに値をいれなくてもprinf("%d"a[1])とかすれば大丈夫ですよね?
int n=1;
printf("%d",a[1]);としても同じことですし。

でも、理解できないのが、fseek()で先頭から4バイト目を読み取るって指定してるじゃないですか。
a[/url]のなかに値を入れたらfseeku()ってほとんど意味なくなってしまうのではないですか??

一応、int n=1;としてprintf("%d",a[n]);としたら、3と出てきました。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:01
by miyaza
fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:06
by miyaza
> fseek()をコメントアウトしてint i=1;としてprintf("%d",a[n]);としたらどうなりますか?
fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?
間違えました。

バイナリファイルの中には様々な情報を格納していくことになるでしょう。そしてそれを必要としたとき指定した所から指定した大きさ分取り出すことができるのはとても便利なので、ランダムアクセスはとても意味のあることだと思います。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:12
by み~
>fseek()をコメントアウトしてint n=1;としてprintf("%d",a[n]);としたらどうなりますか?

やってみました。結果は2とでてきました。

これってどういうことでしょう?fseek()を使わなくても読み取れてしまいましたが・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:17
by み~
int i = 2; としてやったら今度は3がでてきて確かにしっかり読み込めています。。
でも、これではfseek()の意味がなくなってしまいますよな??

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:20
by miyaza
fseek()はファイルポインタ位置を変えています。
つまりfseek(fp,4,SEEK_SET)としたときは、4バイト目からが開始位置となります。
fread()で実際に読みこんでいます。

だからfseek(fp,4,SEEK_SET)したときとfseek()をコメントアウトしたときでは、freadが読み込み始める位置が4倍と違います。だから2と3と結果が違うのは4バイト分のずれのせいです。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:25
by miyaza
たとえば4バイトずつナンバーを格納したバイナリファイルを作るとしましょう。
一人目の人のナンバー二人目の人のナンバー三人目の人のナンバーと連続で入っているとして、その中から3人目の人のナンバーだけ変数 int num にとり出せと言われたらどうしますか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:32
by み~
int型は4バイトですよね。すると、fseek(fp,4,SEEK_SET)とした時、配列でいうと何処が読み始める位置になるのですか?

[0][1][2][3][4][5][6][7][8][9]←添え字
[1][2][3][4][5][6][7][8][9][10] ←値

int i = 1
fseek(fp,4,SEEK_SET)
printf("%d",a);
だと3と出てくる。。やっぱり、何処から読み込みはじめてるのか・・・。もやもやする。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:41
by miyaza
fseek(fp,4,SEEK_SET)だと

[0][1][2][3][4][5][6][7][8][9] 添え字
[2][3][4][5][6][7][8][9][10]  値

こうなります。

Re:ファイルの読み込み書き込み

Posted: 2007年3月17日(土) 12:46
by み~
理解できました!!!

fseek(fp,8,SEEK_SET)でint i =1;にした場合だと、4がでますよね。
づれているわけですね。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 09:30
by み~
みなさんお久しぶりです。ファイルはだいぶできるようになったのですが、またまたつまずいています。

書き込みのコード
#include <stdio.h>

int main(void) {
	int num[10] = {1,2,3,4,5,6,7,8,9,};
	int i;

	FILE *fp;
	fp = fopen("test2.txt","wb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++){
		fwrite(&num,sizeof(num),1,fp);
	}
	
	fclose(fp);
	return 0;
}


読み込みのコード
include <stdio.h>

int main(void) {
	int num[10];
	int i ;
	FILE *fp;
	fp =fopen("test2.txt","rb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}
	
	for(i = 0; i < 10; i++) {
			fread(&num,sizeof(num),1,fp);
	}

	for(i = 0; i < 10; i++) {
		printf("%d\n",&num);
	}

	fclose(fp);
	return 0;
}

うまく読み取れないのです。。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 09:49
by miyaza
読み取り表示部分
printf()でnumのアドレスを渡しています。アドレスではなく値を渡してください。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 09:53
by み~
miyazaさんお久しぶりです。毎回アドバイスありがとうございます。無事読み取りできました!!

少しずつではありますが、コードが書けるようになってきました。関数の引数なども調べればなんとかなってきています。だが、小さなミスが多すぎますね~自分の場合。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:13
by み~
今、バイナリファイルに文字列を書き込み、ランダムアクセスで特定の文字列を読み取ろうとしているのですが、苦戦中です。。なぜか、ファイルはできているのに書き込まれていないのです。。
#include <stdio.h>

int main(void) {
	char ch[/url] = "hello";

	FILE *fp;
	fp = fopen("test.txt","wb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	fwrite(&ch[/url],sizeof(char),1,fp);

	fclose(fp);
	return 0;
}
fwrite(&ch[/url],sizeof(char),1,fp);の部分で[/url]をはずすとコンパイルできるのですが、[/url]を付けると
C:\vc\RA_test2\rw_ex01.c(14) : error C2059: 構文エラー : ']'とでてしまいます。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:19
by miyaza
fwrite(ch,sizeof(ch),1,fp);
として下さい。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:22
by み~
治してみました。確かにコンパイル実行もできました。ファイルには、hとしか書き込まれていませんでしたが、これでいいのでしょうか?一応、バイナリ形式で書き込んだつもりなのですが・・・

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:25
by miyaza
こちらでは、helloと書き込めましたが。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:27
by み~
そうですか。。もう一度試してみます!!
後、バイナリ形式で書き込んでいるので、普通は人間が見ても分からないような感じで書き込まれているのではないですか?普通にhelloと書き込まれていてもいいものなのでしょうか??

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:30
by み~
もう一度コンパイルしたらエラーが出てしまいますね。。
#include <stdio.h>

int main(void) {
	char ch[/url] = "hello";

	FILE *fp;
	fp = fopen("test.txt","wb");
	if(fp == NULL) {
		return 1;
	}else{
		printf("open\n");
	}

	fwrite(ch,sizeof(char),1,fp);

	fclose(fp);
	return 0;
}
IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:31
by miyaza
このファイルをバイナリエディタで開くと、68 65 6C 6C 6F 00 と書き込まれています。
68がh 65がe という感じです。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:32
by keichan
fwrite 関数の仕様を確認してください。

[color=#ff00ff">size_t[/color] fwrite(
    [color=#0000ff">const[/color] [color=#0000ff">void[/color] *buffer,    /* 書き込むデータへのポインタ */
    [color=#ff00ff">size_t[/color] size,        /* 項目のサイズ(バイト単位) */
    [color=#ff00ff">size_t[/color] [color=#ff00ff">count[/color],        /* 書き込む最大項目数 */
    FILE *stream        /* FILE構造体へのポインタ */
);

ですので、

fwrite(ch, sizeof(char), 1, fp);

では、
	chの先頭アドレスから(ch)
	1バイト単位で(sizeof(char))
	最大1項目を(1)
	FILEへ書き込み(fp)
となります。

ですから出力結果は'h'しか出力しない。ということが分かりますね?

では み~さんが期待する出力をしたい場合はどうすればいいでしょうか?

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:36
by み~
keichan さんへ
・・・なんとなく分かります。いろいろ試してみます!!アドバイスありがとうございます!!

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:40
by み~
IBCD.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です
Debug/RRA_test.exe : fatal error LNK1120: 外部参照 1 が未解決です。
のエラーが解決できないですね・・・・。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:47
by miyaza
使っているのはVCですか?
だったらプロジェクトの設定がまずかったんだと思います。
もう一回プロジェクトから作り直してみてはどうでしょう。
main()がないと起こるエラーですが。

Re:ファイルの読み込み書き込み

Posted: 2007年3月19日(月) 10:47
by み~
解決できました!!コンパイル実行もできました。ファイルにはhelloと書き込まれていました!!
バイナリファイルなのに、helloと書き込まれてていいのでしょうか?普通だったら、数字とかで書き込まれて
いるはずだと思うのですが。ちなみに、バイナリエディタというものはもっていないので普通のメモ帳を使用しています。