ファイルの上書き…?
ファイルの上書き…?
お世話になっております。
住所登録プラグラムを作成中なのですが、住所等をファイルに書き込みしプログラムを終了したあと、もう一度プログラムを起動した時は住所登録者が表示されるのですが、その後またプログラムを終了し、もう一度起動すると登録者が表示されない、というか登録したデータが消えてしまっています;
どうやったら何度繰り返しても消えないようになるのでしょうか…?
ソースは添付にて失礼いたします。
住所登録プラグラムを作成中なのですが、住所等をファイルに書き込みしプログラムを終了したあと、もう一度プログラムを起動した時は住所登録者が表示されるのですが、その後またプログラムを終了し、もう一度起動すると登録者が表示されない、というか登録したデータが消えてしまっています;
どうやったら何度繰り返しても消えないようになるのでしょうか…?
ソースは添付にて失礼いたします。
Re:ファイルの上書き…?
write関数で、fopenを"w"で呼び出してますが、これは、同名ファイルがあれば削除して、新たに空っぽのファイルを作るという意味です。
Re:ファイルの上書き…?
データが消えるのではなくて、
なにもないデータを上書きしているのが原因かと。
ファイル書き込みのモードが"w"になっているので、
ファイルポインタをファイルの先頭に指定しています。
モードを"a"にしてみてください
なにもないデータを上書きしているのが原因かと。
ファイル書き込みのモードが"w"になっているので、
ファイルポインタをファイルの先頭に指定しています。
モードを"a"にしてみてください
Re:ファイルの上書き…?
回答ありがとうございます^^
モードを"a"にしてみたら消えなくなったのですが、終了し再度起動すると住所登録者が勝手に増えてしまいます…;
これは途中のプログラムが原因でしょうか??;
モードを"a"にしてみたら消えなくなったのですが、終了し再度起動すると住所登録者が勝手に増えてしまいます…;
これは途中のプログラムが原因でしょうか??;
Re:ファイルの上書き…?
"w"で間違っていません。
上書きするのだから、アペンドモードにする必要はありません。
問題点1
fgets(filedata,1024,fp)!=NULL
ですが、fgetsは改行文字も配列に格納します。
改行文字を取り除かないと、2回目からおかしくなるはずです。
問題点2
性別は1か2でデータを持っているはずです。それなら、保存するデータも
1か2を保存しなくてはいけません。
上書きするのだから、アペンドモードにする必要はありません。
問題点1
fgets(filedata,1024,fp)!=NULL
ですが、fgetsは改行文字も配列に格納します。
改行文字を取り除かないと、2回目からおかしくなるはずです。
問題点2
性別は1か2でデータを持っているはずです。それなら、保存するデータも
1か2を保存しなくてはいけません。
Re:ファイルの上書き…?
回答ありがとうございます。
改行文字を取り除くには、ファイル書き込み関数の改行を消すだけで良いのでしょうか…?;
課題での指定は1か2で性別を判定し、表示は"男性"または"女性"としなければならないのですが、そのようにする方法はありませんでしょうか??;
改行文字を取り除くには、ファイル書き込み関数の改行を消すだけで良いのでしょうか…?;
課題での指定は1か2で性別を判定し、表示は"男性"または"女性"としなければならないのですが、そのようにする方法はありませんでしょうか??;
Re:ファイルの上書き…?
試しに
読み込みを
while(fscanf(fp,"%s",filedata)!=EOF){
に変えてみてください。
それからwriteの関数を
にしてみてください。
結果をしらせてください。
読み込みを
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:ファイルの上書き…?
改行文字について
filedataの先頭から'\n'を探索してそれを'\0'に置き換えるというかんじで
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:ファイルの上書き…?
回答ありがとうございます。
non様、pooka様どちらのもやってみましたが、無事に消えずに何度も読み書きできるようになりました^^
しかし、何故か性別のところで「1」を入力しても一度プログラムを終了しまた起動したときに照会すると性別のところが「女性」になってしまいます;
non様、pooka様どちらのもやってみましたが、無事に消えずに何度も読み書きできるようになりました^^
しかし、何故か性別のところで「1」を入力しても一度プログラムを終了しまた起動したときに照会すると性別のところが「女性」になってしまいます;
Re:ファイルの上書き…?
添付したファイルを実行するとどうなりますか?
あと確認なんですが
>表示は"男性"または"女性"としなければならない
これはプログラムを実行したときですか?
それとも書き込んだファイルですか?
あと確認なんですが
>表示は"男性"または"女性"としなければならない
これはプログラムを実行したときですか?
それとも書き込んだファイルですか?
Re:ファイルの上書き…?
回答ありがとうございます。
pooka様が添付してくださったファイルを実行してみたら、きちんとできました^^
ありがとうございました!
性別の表示ですが、課題のプリントに詳しいことが書かれていないのでよくわからないのですがおそらく新規登録の入力時以外は全て"男性"または"女性"と表示させるのだと思います…;
pooka様が添付してくださったファイルを実行してみたら、きちんとできました^^
ありがとうございました!
性別の表示ですが、課題のプリントに詳しいことが書かれていないのでよくわからないのですがおそらく新規登録の入力時以外は全て"男性"または"女性"と表示させるのだと思います…;
Re:ファイルの上書き…?
プログラムを実行したときに"男性"または"女性"と表示すればいいだけなら
nonさんも書かれてますがファイルに1か2を書いて、それを読み込んだほうがいいと思います。
nonさんも書かれてますがファイルに1か2を書いて、それを読み込んだほうがいいと思います。