【C言語】テキストファイル内のデータを一行削除

このQ&Aのポイント
  • C言語でテキストファイル内の特定の行を削除する方法について教えてください。
  • 例えば、scanfで入力した文字列と一致する行をテキストファイルから削除する方法を教えてください。
  • バナナと入力された行をテキストファイルから削除し、行を詰める方法について教えてください。
回答を見る
  • ベストアンサー

【C言語】テキストファイル内のデータを一行削除

いつもお世話になっております。 ファイル操作についてご教授ください。 sample.txtに下記のデータが格納されています。 【sample.txt】 ------------------- りんご 100円 バナナ 120円 苺 150円 ------------------- この状態で、scanfで「バナナ」と入力し、 sample.txtからバナナの行を削除し、 行を詰めるようにしたいのですが、 どのようにしたらいいのでしょうか。 【流れ】 "文字を入力してください"のメッセージ。   ↓ 「バナナ」と入力。   ↓ ------------------- りんご 100円 苺 150円 ------------------- 上記のように、scanfで入力した「バナナ」の行が削除され、 行が詰められている上状態にしたいです。 超が付くほどの初心者なので、 ソースも書いていただけると幸いです。 どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#208507
noname#208507
回答No.2

下のソースコードをコンパイルして実行すると、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; } ------------ ここまで ------------

kotetsu610905
質問者

お礼

ulisrtさん、 ご回答ありがとうございます。 ソースコードも記載していただき、 本当に助かります。 さっそく試させていただきます。 ありがとうございました。

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.4

>ulisrtさんの教えていただいたコードに、 >ファイルを削除する内容のコード付け加えようとしているのですが、 >なかなか上手くいきません。 元のプログラムがどういう流れになってるのか理解できてます? まずはそこから始めた方がいいと思いますよ。

kotetsu610905
質問者

お礼

wormholeさん、 ご回答ありがとうございます。 スマートなコードではないですけど、 なんとか解決できました。

noname#208507
noname#208507
回答No.3

申し訳ありません。 こちらは実行したパスにスペースを含んでいなかったので、手間を取らせてしまったようですね。 ついでなので訂正します。 ソースコードの最後の return 1; も return 0; の間違いです。 1ではエラー終了扱いになるので。

kotetsu610905
質問者

お礼

ulisrtさん、 わざわざありがとうございます。 本当に助かりました。 ulisrtさんの教えていただいたコードに、 ファイルを削除する内容のコード付け加えようとしているのですが、 なかなか上手くいきません。 厚かましいお願いなのですが、 どうかご指南いただけないでしょうか。 【追加しようとしているコード】 #include <stdio.h> int main(void) { char *filename = "sample.txt"; if( remove( filename ) == 0 ){ printf( "%sファイルを削除しました", filename ); } else{ printf( "ファイル削除に失敗しました" ); } return 0; } どうぞ、宜しくお願い致します。

kotetsu610905
質問者

補足

説明に漏れがありましたので、 補足させていただきます。 【流れ】 sample.txt読み込み   ↓ output.txt書き出し ------------------(ここまではulisrtさんにご協力いただきました。)   ↓ sample.txtを削除 どうぞ宜しくお願い致します。

  • ysawave
  • ベストアンサー率50% (2/4)
回答No.1

まず、ファイルの内容を直接更新するのはハードルが高いと思います。 (初心者であれば、なおさら) なので、考え方だけ書きますと 「元のファイル<1>を1行ずつ読み込み、必要な行ならば別のファイル<2>に書き出す」 方針が良いのでは? さらに"元のファイル名"のものだけ残したいとするのであれば、 [a] <2>を"元のファイル名"と違う名前で新しく作成する  → 終了したら、<1>を削除して、<2>を"元のファイル名"にリネーム または [b] "元のファイル名"を別名にリネームしたものを<1>とする  <2>を"元のファイル名"で新しく作成する  → 終了したら、不要となった<1>を削除する といった段取りで。

kotetsu610905
質問者

お礼

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

関連するQ&A

  • ファイル内のデータを1行削除する方法

    いつもお世話になります。 今、ファイル操作を勉強しています。 sample.txtに下記のデータが格納されています。 【sample.txt】 --------------------- yamada.txt | 29 suzuki.txt | 25 kitamura.txt | 30 endo.txt | 32 --------------------- char *name="suzuki.txt"; sample.txtのデータがchar nameと一致する、 ファイルの行を削除し、行を詰めたいのですが どうしたらいいのでしょうか? 結果として、sample.txtが、 --------------------- yamada.txt | 29 kitamura.txt | 30 endo.txt | 32 --------------------- のように、一致したsuzuki.txtの行が削除され、 行が詰められている状態にしたいです。 どうぞよろしくお願い致します。

  • 【C言語】ファイル操作について

    いつもお世話になっております。 ファイル操作についてご教授ください。 sample.txtに下記のデータが格納されております。 【sample.txt】 ----------- 1 AAA 2 BBB 3 CCC ----------- コンパイルしsample.txtの内容を画面に表示させ、 ユーザに1~3の番号を選択させます。 仮にユーザが番号2を選択したとします。 その後ユーザの名前もscanfで入力させます。 番号と名前がこれでいいか画面上で再度表示させ、 「はい」をユーザが実行したら下記の様にsample.txtを 自動で編集するようにしたいです。 【sample.txt】 ----------- 1 AAA 今日の日付(ex.yyyymmdd) ユーザの名前 2 BBB 3 CCC ----------- ソースを書いていただけると幸いです。 注文が多いですが、何卒宜しくお願い致します。

  • C言語 ファイル入出力について

    test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいのですがどうもうまくいきません。色々ネットで探したりしたのですがstrlenをうまく使うのかな~ぐらいしか見当はつきません・・・。 何かよいアドバイスをお願いします!m(_ _)m 例 test.txt --------------------------------- 私の一番好きな食べ物はリンゴです。 --------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ test1.txt ---------------------------------- 私の一番好きな 食べ物はリンゴ です。 ----------------------------------

  • 同じ行の中で重複するデータを削除してつめる方法

       A    B    C     D      E    F 1|りんご|いちご|りんご|ぶどう|ばなな|りんご 2|すもも|ばなな| 3|りんご|りんご|びわ | 4|かき |りんご|ばなな| データが上記のように記入されている場合、 下記のように、同じ行の中で重複するデータを削除してつめる方法をご伝授ください。     A    B    C     D      E    F 1|りんご|いちご|ぶどう|ばなな|  2|すもも|ばなな| 3|りんご|びわ | 4|かき |りんご|ばなな| よろしくお願いします。

  • テキストファイルの内容を部分的に削除したい

    ファルダの中の.txtファイルに対して、 ある文字が含めましたら、その行を削除します。 他の部分はそのまま残します。 上記の操作を実現したいです。 サンプルを教えてください。 お願いします。 ==================== 例えば、ファイルa.txt ーーーーーーーーーーーーーーー kjklだjkl;じゃ kljk日本jこdじゃか jこjkl;j ーーーーーーーーーーーーーーーーー ”日本”が有るの第二行を削除して、 他の部分そのまま残したい。 ーーーーーーーーーーーーーーー kjklだjkl;じゃ jこjkl;j ーーーーーーーーーーーーーーーーー 上記の操作をWHSで実現したいです。 教えてくださいますようお願いいたします。 ======================

  • テキストファイルにおいて任意の単語を含む一行を削除させたい

    テキストファイルの任意の単語を含む一行を削除させるプログラムを作成したいです。 例えば、 test.txt 今日は久しぶりに晴れました。 とてもいい天気だったので、ショッピングに。 その後、アップルストアにて新発売のMacを触ってきました。 上記のようなテキストファイル(test.txt)に対して、 データベース等に格納されている単語のリストと参照させ、 リストにある単語を含んでいる行を削除させたテキストファイルを生成させたいです。 例えば、リストに"天気"の単語があれば、 以下のようなテキストファイルを生成させたいです。 result.txt 今日は久しぶりに晴れました。 その後、アップルストアにて新発売のMacを触ってきました。 このようにするには、どのようにプログラムを作成すればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • テキストファイル内の指定文字が含まれる行以下を削除

    いつもお世話になります。 以下、バッチ(bat)で可能でしょうか? テキストファイル内(sample.txt)に指定文字(SA2:という文字)が必ず1行含まれていて 2行以上にはなりません。 SA2が含まれる行以下を削除し、sample1.txtという名前で保存したいです。 findstr SA2 でSA2が含まれる行を調べられるのいですが、その行を含む以下の行を 削除するというのが、どのように考えたらいいのかわかりません。 お力添え頂けますでしょうか? 宜しくお願い致します。

  • C言語 ファイル内のデータと入力したデータの重複

    テキストファイルを読み込み、入力したデータとの重複がないかどうかを調べたいのですが、 わからない点があるため、質問させていただきます。 -------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {    FILE *fp;    char datafile[];= "sample.txt";    char buff[512]; //読み込んだ1行分のデータを格納    char *data[1000]; //読み込んだデータを格納    int data_c = 0; //データの数    char str[256]; //入力された文字列を格納    int i;    int check; //重複チェック         (中略)    //ファイルを1行ずつ読み込み、その長さのメモリを確保し、値をコピー    while(fgets(buff, sizeof buff, fp) != NULL) {      data[data_c] = (char*)malloc(strlen(buff) + 1);      strcpy(data[data_c++], buff);    }         (中略)    //文字列を入力    fgets(str, 256, stdin);    check = 0;    //すでにあるデータと入力したデータの重複を調べる    for(i=0; i<data_c; i++) {      if(strcmp(data[i], str) == 0) {      check = 1;      break;      }    }         (中略) -------------------------------------------------------- 例えば読み込むファイルに5行書かれていた場合、 data[0]からdata[4]に確保したメモリの先頭アドレスが格納されますよね? ということはdata_cの値は4となるのですが、 その後のファイルデータと入力したデータの重複を調べるところで、 for(i=0; i<data_c; i++) となっており、data[0]からdata[3]までの4行分しか調べられないことになります。 なぜ、i<=data_cではなく、i<data_cとなっているのか、わかりましたら教えていただけますでしょうか。

  • エクセルで2列に入力された同一データを全て抽出したい

    下の表でA列とB列に入力された「バナナ」を全て、すなわち1,2,3,5行目を抽出をしたいのです。 データ量が1000行を越すため、効率よく抽出する 方法を教えてください。     A    B 1 バナナ  みかん 2 りんご  バナナ 3 バナナ  バナナ 4 いちご  みかん 5 バナナ  いちご

  • spreadsheetで特定行のみ抽出する関数等

    googlleのspreadsheetで特定行のみ抽出する関数等はありますか?(EXCELでもよいです。似たようなのはあると思うので) 1 バナナ 2 りんご 3 いちご という表があったとして、ある店では、1と3しか売っていない。その際、その店用の 1 バナナ 3 いちご という詰めた表(チェック表)を作る、というのが必要な状況です。 表の項目(行)数は100くらい、店舗数は10くらいあります。 Excelでのやり方でも良いです。 もちろん、各店舗の表の方で、必要なものだけ番号を入れて、vlookupで項目名を引っ張ってくるというはできます。しかしこれだと、そのつど追加したり削除するごとに行をずらしたりする必要があるので、できれば(例えば)下記のようにしたいです。 〇をつけたものが選択される形 (基本の表1) 1 バナナ 2 りんご 3 いちご (選択するステップ 表2) 1〇バナナ 2 りんご 3〇いちご (結果としての表 表3) 1 バナナ 3 いちご この関数が使えるとか、他、何かヒントでもいただけるとありがたいです。