ページ 1 / 1
たびたび失礼します。
Posted: 2010年7月20日(火) 17:33
by 黒猫
下記ってもう少しスリムにならないですか??
これ以上の仕方がわからないので・・・お願いしまうす。
if((out = fopen("eep_size.txt", "r+")) == NULL){
printf("ファイルがありません。作成します。\n");
out = fopen("eep_size.txt", "w");
}
else if((out = fopen("eep_size.txt", "r+")) != NULL){
printf("ファイルが存在します\n");
printf("上書きしますか? yes/no \n");
scanf("%3s", answer);
if(strcmp(answer, "yes") == 0){
out = fopen("eep_size.txt", "w");
}
else{
fclose(in);
printf("終了します\n");
exit(0);
}
}
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 19:13
by パコネコ
if文のカッコを削るとか?
r+じゃなくてwだけでできる気がする…勘違いだったらすいません
wでも新規作成しますよね?
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 19:25
by シエル
何がしたいのかよく分かりませんが、
どの辺をスリムにしたいのですか?
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 20:57
by 黒猫
ファイルの中の文字列を検索してtxtに書き込みをするんですが、
任意で入力したtxtが存在すれば「上書き」をするかとか、ないと
きは「新規」にtxtを作成するっていうものを作っています。
上のはその一部で、その部分がもっと簡単にできるとかないかなぁっと思って…。
なかったら良いのですが…。
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 21:00
by パコネコ
wだけだったら新規作成しますか?とかができなくなりますね。
失礼しました。
見やすいまま行数を減らしたいんですか?
それとも、文字数を減らしたいんですか?
もっときれいなやり方はありますか?ってことですか?
(または効率のいい)
どれかだとは、思いますけど…
=============
すいません。投稿がかぶりました。
(タイミングが…)

Re:たびたび失礼します。
Posted: 2010年7月20日(火) 21:03
by シエル
最初のfopenの結果をif文の前に変数に代入しといて、
その変数をif文にかけたら少しはすっきりするんじゃないでしょうか。
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 21:14
by 黒猫
そうですねぇ・・・。
あまり長くするのは嫌なので、行数減らして効率の良い方法ですね。
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 21:34
by パコネコ
プログラム面では削れるもしくは書き換えるのはif文の中ぐらいなのでそれ以外の
書き方で行数をへらしてみます。
(少し見ずらくなったらごめんなさい)
/*
printf("ファイルが存在します\n");
printf("上書きしますか? yes/no \n");
*/
<tt>
printf("ファイルが存在します\n"
"上書きしますか?yes/no \n");
</tt>
行数は変わらないけど…
/*
if(strcmp(answer, "yes") == 0)
{
out = fopen("eep_size.txt", "w");
}
else{
*/
赤色削るとか?
結果一行のみ削れた…ダメですね。
================
むしろこれ削れます?
//if((out = fopen("eep_size.txt", "r+")) != NULL)

Re:たびたび失礼します。
Posted: 2010年7月20日(火) 22:09
by めるぽん
とりあえず、
...
fclose(out);
out = NULL; // 上書きしないときは exit してるからこれはいらないかも
printf("ファイルが存在します\n");
...
とするべきかと。まず正しく動かすことが重要です。
Re:たびたび失礼します。
Posted: 2010年7月20日(火) 22:12
by Poco
効率がいいかどうか分かりませんが。。。
----
out = fopen("eep_size.txt", "r+");
if( out == NULL ){
printf("ファイルがありません。作成します。\n");
out = fopen("eep_size.txt", "w");
} else {
printf("ファイルが存在します\n");
printf("上書きしますか? yes/no \n");
scanf("%3s", answer);
if(strcmp(answer, "yes") == 0){
/*fclose(out)は要らない?*/
out = fopen("eep_size.txt", "w");
}
}
if ( out == NULL ){
fclose(in);
printf("終了します\n");
exit(0);
}
----追記
↓のパコネコさんのご指摘にあるように、
上のソースは間違っています。

Re:たびたび失礼します。
Posted: 2010年7月20日(火) 23:51
by パコネコ
あれ?
YESじゃないときの処理が削られてる…最後のはなんでinを閉じるんですか?
ミス?
Re:たびたび失礼します。
Posted: 2010年7月21日(水) 00:07
by Poco
> あれ?
> YESじゃないときの処理が削られてる…最後のはなんでinを閉じるんですか?
> ミス?
ををぅ、ミスですね。
No:57020は忘れてください。
#Yesじゃない時の処理がプログラム終了とは思わなかったので
#読み違えちゃいました。。
Re:たびたび失礼します。
Posted: 2010年7月21日(水) 00:44
by パコネコ
ほとんどあってると思うので、忘れる必要もないような気が・・・
YESじゃないときの処理付け足して
最後にアウトで閉じたら完成なのでは?
いい形にできてると思う。
Re:たびたび失礼します。
Posted: 2010年7月21日(水) 01:01
by ISLe
if ((out = fopen("eep_size.txt", "r")) != NULL) {
fclose(out);
printf("ファイルが存在します\n");
printf("上書きしますか? yes/no \n");
scanf("%3s", answer);
if (strcmp(answer, "yes") != 0) {
fclose(in);
printf("終了します\n");
exit(0);
}
}
else {
printf("ファイルがありません。作成します。\n");
}
out = fopen("eep_size.txt", "w");
何か足らないですかね。
Re:たびたび失礼します。
Posted: 2010年7月21日(水) 14:26
by パコネコ
fclose(in);
これは?
outなのでは?
あとは…見つかりませんでした。
Re:たびたび失礼します。
Posted: 2010年7月21日(水) 18:17
by Poco
> fclose(in);
> これは?
> outなのでは?
黒猫さんご本人がこう書かれているので、間違いではないと思いますよ。
Re:たびたび失礼します。
Posted: 2010年7月22日(木) 00:35
by パコネコ
ほんとだ…でもなんでinを閉じるんでしょう?
Re:たびたび失礼します。
Posted: 2010年7月22日(木) 01:18
by ISLe
この部分より前にファイルを開いてて、このあとinから読み込んでoutに書き出す処理が続く、と想像します。
Re:たびたび失礼します。
Posted: 2010年7月22日(木) 18:25
by QERA
初めまして、横から失礼します。
こんな感じではどうでしょうか?
if((out = fopen("eep_size.txt","r")) != NULL){
printf("ファイルが存在します\n上書きしますか? yes/no\n");
scanf("%3s",answer);
if(strcmp(answer,"yes") == 0){
out = fopen("eep_size.txt","w");
}
}
else{
printf("ファイルがありません。作成します。\n");
out = fopen("eep_size.txt","w");
}
fclose(out);
printf("終了します\n");
exit(0);
帰り際に急いで考えたので、動くかどうかはちょっと怪しいですが・・・
"終了します"の文字位置はここではいけないのでしょうか?
それと、この部分だけのコードですとどうしても最後のfcloseが
inではおかしいように思えます。
ISLeさんは想像しますと書いていますが、私たちは分からないので、ある部分だけで判断してしまうと思うので、ここはfclose(out)というようにしました。
すみません、急いでいるので何を書いているのか自分でもちんぷんかんぷんなので^^;
Re:たびたび失礼します。
Posted: 2010年7月22日(木) 18:42
by ISLe
> ISLeさんは想像しますと書いていますが、私たちは分からないので、ある部分だけで判断してしまうと思うので、ここはfclose(out)というようにしました。
inについては想像するしかできませんが、質問のコードでは最後のブロックを抜けたところでoutが"w"モードでオープンされているので、それは必要条件になるのではないかと。
Re:たびたび失礼します。
Posted: 2010年7月22日(木) 19:05
by QERA
>ISLeさん
まあ、inであってもoutであっても、黒猫さんが合っているやりかたで
やってもらえばどちらでもいいと思います。
とりあえず私はoutではないかと、思ったものなので
Re:たびたび失礼します。
Posted: 2010年7月22日(木) 20:54
by 黒猫
たくさんの回答ありがとうございます。
皆さんの回答を参考にさせていただきます。
因みに言うと、載せているソースは上下に続きがあるので、混乱されたと思います。
上に読み込み(in)がオープンしているので、書き込みファイルをyes以外(no)にすると
ファイルをクローズしてプログラムが終了します。

Re:たびたび失礼します。
Posted: 2010年7月22日(木) 21:37
by パコネコ
終わったみたいなのでいいんですけど…かたっぽだけなんですね。
inはともかくoutは閉じないんですね。
いっそinも閉じなきゃいいのに…と、愚痴っときます。
Re:たびたび失礼します。
Posted: 2010年7月23日(金) 00:55
by ISLe
コードの一部だとおっしゃっているので、そっくり入れ替えられることを心がけました。