ファイルの上書き…?

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

ファイルの上書き…?

#1

投稿記事 by ほのか » 16年前

お世話になっております。

住所登録プラグラムを作成中なのですが、住所等をファイルに書き込みしプログラムを終了したあと、もう一度プログラムを起動した時は住所登録者が表示されるのですが、その後またプログラムを終了し、もう一度起動すると登録者が表示されない、というか登録したデータが消えてしまっています;
どうやったら何度繰り返しても消えないようになるのでしょうか…?

ソースは添付にて失礼いたします。

tk-xleader

Re:ファイルの上書き…?

#2

投稿記事 by tk-xleader » 16年前

write関数で、fopenを"w"で呼び出してますが、これは、同名ファイルがあれば削除して、新たに空っぽのファイルを作るという意味です。

kazuoni

Re:ファイルの上書き…?

#3

投稿記事 by kazuoni » 16年前

データが消えるのではなくて、
なにもないデータを上書きしているのが原因かと。
ファイル書き込みのモードが"w"になっているので、
ファイルポインタをファイルの先頭に指定しています。

モードを"a"にしてみてください

kazuoni

Re:ファイルの上書き…?

#4

投稿記事 by kazuoni » 16年前

・・・被りました^^;

ほのか

Re:ファイルの上書き…?

#5

投稿記事 by ほのか » 16年前

回答ありがとうございます^^
モードを"a"にしてみたら消えなくなったのですが、終了し再度起動すると住所登録者が勝手に増えてしまいます…;
これは途中のプログラムが原因でしょうか??;

non

Re:ファイルの上書き…?

#6

投稿記事 by non » 16年前

"w"で間違っていません。
上書きするのだから、アペンドモードにする必要はありません。

問題点1
fgets(filedata,1024,fp)!=NULL
ですが、fgetsは改行文字も配列に格納します。
改行文字を取り除かないと、2回目からおかしくなるはずです。

問題点2
性別は1か2でデータを持っているはずです。それなら、保存するデータも
1か2を保存しなくてはいけません。

ほのか

Re:ファイルの上書き…?

#7

投稿記事 by ほのか » 16年前

回答ありがとうございます。

改行文字を取り除くには、ファイル書き込み関数の改行を消すだけで良いのでしょうか…?;
課題での指定は1か2で性別を判定し、表示は"男性"または"女性"としなければならないのですが、そのようにする方法はありませんでしょうか??;

non

Re:ファイルの上書き…?

#8

投稿記事 by non » 16年前

試しに
読み込みを
while(fscanf(fp,"%s",filedata)!=EOF){
に変えてみてください。

それからwriteの関数を
void write(Jusyoroku *data,int cnt,char *path){
	
	FILE *fp;
	int i;
	char dansei[2] = "1";
	char jyosei[2] = "2";

	if((fp = fopen(path,"w"))==NULL){
		printf("File Open ERROR\n");
		exit(1);
	}

	//fprintf(fp,"\n");
	
	for(i=0;i<cnt;i++){
		fprintf(fp,"%s\n",data.name);
		fprintf(fp,"%s\n",data.yubin);
		fprintf(fp,"%s\n",data.add);
		fprintf(fp,"%s\n",data.tel);
		fprintf(fp,"%s\n",data.sei);
		/*
		if(strcmp(data.sei,dansei)==0){
			fprintf(fp,"性別: 男性\n");
		}else
		if(strcmp(data.sei,jyosei)==0){
			fprintf(fp,"性別: 女性\n");
		}
		*/
		fprintf(fp,"\n");
	}

	fclose(fp);
	
	
}

にしてみてください。
結果をしらせてください。

pooka

Re:ファイルの上書き…?

#9

投稿記事 by pooka » 16年前

改行文字について
filedataの先頭から'\n'を探索してそれを'\0'に置き換えるというかんじで
char *s;
s = strchr(filedata,'\n');
	if(s != NULL)
		filedata[s-filedata] = '\0';
これを
while(fgets(filedata,1024,fp)!=NULL){
	if(strcmp(filedata,"\n")==0){
		continue;
	}
	//ここに書く

ほのか

Re:ファイルの上書き…?

#10

投稿記事 by ほのか » 16年前

回答ありがとうございます。
non様、pooka様どちらのもやってみましたが、無事に消えずに何度も読み書きできるようになりました^^
しかし、何故か性別のところで「1」を入力しても一度プログラムを終了しまた起動したときに照会すると性別のところが「女性」になってしまいます;

non

Re:ファイルの上書き…?

#11

投稿記事 by non » 16年前

そんなはずはないですが・・・
保存されているファイルをエディタで開いて確認してください。
2になってますか?

pooka

Re:ファイルの上書き…?

#12

投稿記事 by pooka » 16年前

添付したファイルを実行するとどうなりますか?
あと確認なんですが
>表示は"男性"または"女性"としなければならない
これはプログラムを実行したときですか?
それとも書き込んだファイルですか?

ほのか

Re:ファイルの上書き…?

#13

投稿記事 by ほのか » 16年前

回答ありがとうございます。
pooka様が添付してくださったファイルを実行してみたら、きちんとできました^^
ありがとうございました!

性別の表示ですが、課題のプリントに詳しいことが書かれていないのでよくわからないのですがおそらく新規登録の入力時以外は全て"男性"または"女性"と表示させるのだと思います…;

pooka

Re:ファイルの上書き…?

#14

投稿記事 by pooka » 16年前

プログラムを実行したときに"男性"または"女性"と表示すればいいだけなら
nonさんも書かれてますがファイルに1か2を書いて、それを読み込んだほうがいいと思います。

ほのか

Re:ファイルの上書き…?

#15

投稿記事 by ほのか » 16年前

ありがとうございます!
今後担当の方に聞いてみて、修正するかしないか決めたいと思います^^

閉鎖

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