ページ 1 / 1
ファイルの上書き…?
Posted: 2009年5月21日(木) 09:47
by ほのか
お世話になっております。
住所登録プラグラムを作成中なのですが、住所等をファイルに書き込みしプログラムを終了したあと、もう一度プログラムを起動した時は住所登録者が表示されるのですが、その後またプログラムを終了し、もう一度起動すると登録者が表示されない、というか登録したデータが消えてしまっています;
どうやったら何度繰り返しても消えないようになるのでしょうか…?
ソースは添付にて失礼いたします。
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 10:03
by tk-xleader
write関数で、fopenを"w"で呼び出してますが、これは、同名ファイルがあれば削除して、新たに空っぽのファイルを作るという意味です。
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 10:09
by kazuoni
データが消えるのではなくて、
なにもないデータを上書きしているのが原因かと。
ファイル書き込みのモードが"w"になっているので、
ファイルポインタをファイルの先頭に指定しています。
モードを"a"にしてみてください
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 10:10
by kazuoni
・・・被りました^^;
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 10:25
by ほのか
回答ありがとうございます^^
モードを"a"にしてみたら消えなくなったのですが、終了し再度起動すると住所登録者が勝手に増えてしまいます…;
これは途中のプログラムが原因でしょうか??;
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 10:42
by non
"w"で間違っていません。
上書きするのだから、アペンドモードにする必要はありません。
問題点1
fgets(filedata,1024,fp)!=NULL
ですが、fgetsは改行文字も配列に格納します。
改行文字を取り除かないと、2回目からおかしくなるはずです。
問題点2
性別は1か2でデータを持っているはずです。それなら、保存するデータも
1か2を保存しなくてはいけません。
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 10:59
by ほのか
回答ありがとうございます。
改行文字を取り除くには、ファイル書き込み関数の改行を消すだけで良いのでしょうか…?;
課題での指定は1か2で性別を判定し、表示は"男性"または"女性"としなければならないのですが、そのようにする方法はありませんでしょうか??;
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 11:04
by non
試しに
読み込みを
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);
}
にしてみてください。
結果をしらせてください。
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 11:10
by pooka
改行文字について
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:ファイルの上書き…?
Posted: 2009年5月21日(木) 11:24
by ほのか
回答ありがとうございます。
non様、pooka様どちらのもやってみましたが、無事に消えずに何度も読み書きできるようになりました^^
しかし、何故か性別のところで「1」を入力しても一度プログラムを終了しまた起動したときに照会すると性別のところが「女性」になってしまいます;
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 11:38
by non
そんなはずはないですが・・・
保存されているファイルをエディタで開いて確認してください。
2になってますか?
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 11:39
by pooka
添付したファイルを実行するとどうなりますか?
あと確認なんですが
>表示は"男性"または"女性"としなければならない
これはプログラムを実行したときですか?
それとも書き込んだファイルですか?
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 11:51
by ほのか
回答ありがとうございます。
pooka様が添付してくださったファイルを実行してみたら、きちんとできました^^
ありがとうございました!
性別の表示ですが、課題のプリントに詳しいことが書かれていないのでよくわからないのですがおそらく新規登録の入力時以外は全て"男性"または"女性"と表示させるのだと思います…;
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 12:10
by pooka
プログラムを実行したときに"男性"または"女性"と表示すればいいだけなら
nonさんも書かれてますがファイルに1か2を書いて、それを読み込んだほうがいいと思います。
Re:ファイルの上書き…?
Posted: 2009年5月21日(木) 13:10
by ほのか
ありがとうございます!
今後担当の方に聞いてみて、修正するかしないか決めたいと思います^^