プロが教えるわが家の防犯対策術!

いつもお世話になっております。

ファイル操作についてご教授ください。

sample.txtに下記のデータが格納されています。

【sample.txt】
-------------------
りんご 100円
バナナ 120円
苺 150円
-------------------

この状態で、scanfで「バナナ」と入力し、
sample.txtからバナナの行を削除し、
行を詰めるようにしたいのですが、
どのようにしたらいいのでしょうか。

【流れ】
"文字を入力してください"のメッセージ。
  ↓
「バナナ」と入力。
  ↓
-------------------
りんご 100円
苺 150円
-------------------

上記のように、scanfで入力した「バナナ」の行が削除され、
行が詰められている上状態にしたいです。

超が付くほどの初心者なので、
ソースも書いていただけると幸いです。

どうぞ宜しくお願い致します。

A 回答 (4件)

下のソースコードをコンパイルして実行すると、sample.txt を読み込んで、output.txt に結果を書き出します。

いかに短いコードで作るか試してみました。

------------ ここから ------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

static char buf[BUFSIZ], str[BUFSIZ];

static void input(char *c) {
printf("文字を入力してください\n");
scanf("%s", buf);
sprintf(str, "%s %s < sample.txt > output.txt", c, buf);
system(str);
}

static void output(char *s, int l) {
while (gets(buf)) if (strncmp(buf, s, l)) puts(buf);
}

int main(int ac, char *av[]) {
if (ac == 1) input(av[0]); else output(av[1], strlen(av[1]));
return 1;
}
------------ ここまで ------------
    • good
    • 1
この回答へのお礼

ulisrtさん、
ご回答ありがとうございます。

ソースコードも記載していただき、
本当に助かります。

さっそく試させていただきます。
ありがとうございました。

お礼日時:2012/05/13 10:02

>ulisrtさんの教えていただいたコードに、


>ファイルを削除する内容のコード付け加えようとしているのですが、
>なかなか上手くいきません。

元のプログラムがどういう流れになってるのか理解できてます?
まずはそこから始めた方がいいと思いますよ。
    • good
    • 1
この回答へのお礼

wormholeさん、
ご回答ありがとうございます。

スマートなコードではないですけど、
なんとか解決できました。

お礼日時:2012/05/13 20:56

申し訳ありません。


こちらは実行したパスにスペースを含んでいなかったので、手間を取らせてしまったようですね。

ついでなので訂正します。
ソースコードの最後の
return 1;

return 0;
の間違いです。
1ではエラー終了扱いになるので。

この回答への補足

説明に漏れがありましたので、
補足させていただきます。

【流れ】
sample.txt読み込み
  ↓
output.txt書き出し
------------------(ここまではulisrtさんにご協力いただきました。)
  ↓
sample.txtを削除


どうぞ宜しくお願い致します。

補足日時:2012/05/13 18:12
    • good
    • 0
この回答へのお礼

ulisrtさん、
わざわざありがとうございます。
本当に助かりました。

ulisrtさんの教えていただいたコードに、
ファイルを削除する内容のコード付け加えようとしているのですが、
なかなか上手くいきません。
厚かましいお願いなのですが、
どうかご指南いただけないでしょうか。

【追加しようとしているコード】
#include <stdio.h>

int main(void)
{
char *filename = "sample.txt";

if( remove( filename ) == 0 ){
printf( "%sファイルを削除しました", filename );
}
else{
printf( "ファイル削除に失敗しました" );
}
return 0;
}

どうぞ、宜しくお願い致します。

お礼日時:2012/05/13 18:05

まず、ファイルの内容を直接更新するのはハードルが高いと思います。

(初心者であれば、なおさら)

なので、考え方だけ書きますと
「元のファイル<1>を1行ずつ読み込み、必要な行ならば別のファイル<2>に書き出す」
方針が良いのでは?


さらに"元のファイル名"のものだけ残したいとするのであれば、
[a] <2>を"元のファイル名"と違う名前で新しく作成する
 → 終了したら、<1>を削除して、<2>を"元のファイル名"にリネーム

または
[b] "元のファイル名"を別名にリネームしたものを<1>とする
 <2>を"元のファイル名"で新しく作成する
 → 終了したら、不要となった<1>を削除する

といった段取りで。
    • good
    • 0
この回答へのお礼

ysawaveさん、
ご回答ありがとうございます。
参考になりました。
挑戦してみます。

お礼日時:2012/05/12 20:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています