たびたび失礼します。

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

たびたび失礼します。

#1

投稿記事 by 黒猫 » 15年前

下記ってもう少しスリムにならないですか??
これ以上の仕方がわからないので・・・お願いしまうす。


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:たびたび失礼します。

#2

投稿記事 by パコネコ » 15年前

if文のカッコを削るとか?
r+じゃなくてwだけでできる気がする…勘違いだったらすいません
wでも新規作成しますよね?

シエル

Re:たびたび失礼します。

#3

投稿記事 by シエル » 15年前

何がしたいのかよく分かりませんが、
どの辺をスリムにしたいのですか?

黒猫

Re:たびたび失礼します。

#4

投稿記事 by 黒猫 » 15年前

ファイルの中の文字列を検索してtxtに書き込みをするんですが、
任意で入力したtxtが存在すれば「上書き」をするかとか、ないと
きは「新規」にtxtを作成するっていうものを作っています。

上のはその一部で、その部分がもっと簡単にできるとかないかなぁっと思って…。
なかったら良いのですが…。

パコネコ

Re:たびたび失礼します。

#5

投稿記事 by パコネコ » 15年前

wだけだったら新規作成しますか?とかができなくなりますね。
失礼しました。
見やすいまま行数を減らしたいんですか?
それとも、文字数を減らしたいんですか?
もっときれいなやり方はありますか?ってことですか?
(または効率のいい)
どれかだとは、思いますけど…
=============
すいません。投稿がかぶりました。
(タイミングが…)
画像

シエル

Re:たびたび失礼します。

#6

投稿記事 by シエル » 15年前

最初のfopenの結果をif文の前に変数に代入しといて、
その変数をif文にかけたら少しはすっきりするんじゃないでしょうか。

黒猫

Re:たびたび失礼します。

#7

投稿記事 by 黒猫 » 15年前

そうですねぇ・・・。
あまり長くするのは嫌なので、行数減らして効率の良い方法ですね。

パコネコ

Re:たびたび失礼します。

#8

投稿記事 by パコネコ » 15年前

プログラム面では削れるもしくは書き換えるのは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:たびたび失礼します。

#9

投稿記事 by めるぽん » 15年前

とりあえず、
...
fclose(out);
out = NULL; // 上書きしないときは exit してるからこれはいらないかも
printf("ファイルが存在します\n");
...
とするべきかと。まず正しく動かすことが重要です。

Poco

Re:たびたび失礼します。

#10

投稿記事 by Poco » 15年前

効率がいいかどうか分かりませんが。。。

----
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:たびたび失礼します。

#11

投稿記事 by パコネコ » 15年前

あれ?
YESじゃないときの処理が削られてる…最後のはなんでinを閉じるんですか?
ミス?

Poco

Re:たびたび失礼します。

#12

投稿記事 by Poco » 15年前

> あれ?
> YESじゃないときの処理が削られてる…最後のはなんでinを閉じるんですか?
> ミス?

ををぅ、ミスですね。
No:57020は忘れてください。

#Yesじゃない時の処理がプログラム終了とは思わなかったので
#読み違えちゃいました。。

パコネコ

Re:たびたび失礼します。

#13

投稿記事 by パコネコ » 15年前

ほとんどあってると思うので、忘れる必要もないような気が・・・
YESじゃないときの処理付け足して
最後にアウトで閉じたら完成なのでは?
いい形にできてると思う。

ISLe

Re:たびたび失礼します。

#14

投稿記事 by ISLe » 15年前

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:たびたび失礼します。

#15

投稿記事 by パコネコ » 15年前

fclose(in);
これは?
outなのでは?
あとは…見つかりませんでした。

Poco

Re:たびたび失礼します。

#16

投稿記事 by Poco » 15年前

> fclose(in);
> これは?
> outなのでは?

黒猫さんご本人がこう書かれているので、間違いではないと思いますよ。

パコネコ

Re:たびたび失礼します。

#17

投稿記事 by パコネコ » 15年前

ほんとだ…でもなんでinを閉じるんでしょう?

ISLe

Re:たびたび失礼します。

#18

投稿記事 by ISLe » 15年前

この部分より前にファイルを開いてて、このあとinから読み込んでoutに書き出す処理が続く、と想像します。

QERA

Re:たびたび失礼します。

#19

投稿記事 by QERA » 15年前

初めまして、横から失礼します。
こんな感じではどうでしょうか?

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)というようにしました。

すみません、急いでいるので何を書いているのか自分でもちんぷんかんぷんなので^^;

ISLe

Re:たびたび失礼します。

#20

投稿記事 by ISLe » 15年前

> ISLeさんは想像しますと書いていますが、私たちは分からないので、ある部分だけで判断してしまうと思うので、ここはfclose(out)というようにしました。

inについては想像するしかできませんが、質問のコードでは最後のブロックを抜けたところでoutが"w"モードでオープンされているので、それは必要条件になるのではないかと。

QERA

Re:たびたび失礼します。

#21

投稿記事 by QERA » 15年前

>ISLeさん
まあ、inであってもoutであっても、黒猫さんが合っているやりかたで
やってもらえばどちらでもいいと思います。

とりあえず私はoutではないかと、思ったものなので

黒猫

Re:たびたび失礼します。

#22

投稿記事 by 黒猫 » 15年前

たくさんの回答ありがとうございます。
皆さんの回答を参考にさせていただきます。

因みに言うと、載せているソースは上下に続きがあるので、混乱されたと思います。
上に読み込み(in)がオープンしているので、書き込みファイルをyes以外(no)にすると
ファイルをクローズしてプログラムが終了します。 画像

パコネコ

Re:たびたび失礼します。

#23

投稿記事 by パコネコ » 15年前

終わったみたいなのでいいんですけど…かたっぽだけなんですね。
inはともかくoutは閉じないんですね。
いっそinも閉じなきゃいいのに…と、愚痴っときます。

ISLe

Re:たびたび失礼します。

#24

投稿記事 by ISLe » 15年前

コードの一部だとおっしゃっているので、そっくり入れ替えられることを心がけました。

閉鎖

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