C言語関係掲示板

過去ログ

No.1278 テキストファイル内の文字列削除

[戻る] [ホームページ]
No.16944

テキストファイル内の文字列削除
投稿者---スマイル(2004/09/29 10:32:41)


たとえば
------data.txt-------
10/1 party
10/4 work
10/6 study English
---------------------
この中から10/4をキーとして、10/4の行
ここでは"10/4 work"を削除したいのですが、
なにか良い方法はないでしょうか?
よろしくお願いします。


No.16945

Re:テキストファイル内の文字列削除
投稿者---tetrapod(2004/09/29 10:53:33)


grep -F -v '10/4' data.txt
きっとプログラムを作るより早い・速いです。



No.16946

Re:テキストファイル内の文字列削除
投稿者---スマイル(2004/09/29 11:16:11)


>grep -F -v '10/4' data.txt
>きっとプログラムを作るより早い・速いです。

すみません。環境がwindowsなのでgrepは使えないと思います。
以下は実際に作ってみたプログラムです。

void delete_s(FILE *fpd){
    char dday[20];
    char buf[256];
    char *p;
    FILE *dmy;
    
    if((dmy=fopen("dmy.txt","w"))==NULL){
        printf("dmy open error");
    }
    while(1){
        printf("Type of delete day : ");
            if(gets(dday)==NULL){
                break;
            }
        while(fgets(buf,sizeof(buf),fpd)!=NULL){
            p=strtok(buf,tokn);
            if(strcmp(dday,p)!=0){
                fprintf(dmy,"%s  ",p);
                p = p + sizeof(p) + 1;
                fprintf(dmy,"%s",p);
            }
        }
    }
    fclose(fpd);
    fclose(dmy);
    remove(filename);
    rename("dmy.txt",filename); 
}


ダミーファイルを作ってどうにかなったのですが、
他に何かもっと間単にできる良い方法はないでしょうか?
それと・・プログラム自体にもあまり自信がないので、おかしなところが
あったらすみませんが教えてください。よろしくお願いします。


No.16947

Re:テキストファイル内の文字列削除
投稿者---Sciggepy(2004/09/29 11:28:14)


>すみません。環境がwindowsなのでgrepは使えないと思います。
BCCにはgrepが付属していますが、NT/2000/XPでは、findやfindstrも使えます。



No.16948

Re:テキストファイル内の文字列削除
投稿者---ぽこ(2004/09/29 13:00:20)


>ダミーファイルを作ってどうにかなったのですが、
>他に何かもっと間単にできる良い方法はないでしょうか?

それが一番オーソドックなやり方だと思います。

>それと・・プログラム自体にもあまり自信がないので、おかしなところが
>あったらすみませんが教えてください。よろしくお願いします。

p = p + sizeof(p) + 1;
↑何をやっているのでしょうか?
Win32系なら、多分sizeof(char*)=4となるので、5文字分だけ先に飛ばしている?
日付が10/10とか5文字のものになれば、上手くいかない気がしますが。。


No.16949

Re:テキストファイル内の文字列削除
投稿者---スマイル(2004/09/29 13:26:50)


>それが一番オーソドックなやり方だと思います。
そうですか・・・もっと便利なものはないのですよね

>p = p + sizeof(p) + 1;
>↑何をやっているのでしょうか?
>Win32系なら、多分sizeof(char*)=4となるので、5文字分だけ先に飛ばしている?
>日付が10/10とか5文字のものになれば、上手くいかない気がしますが。。
sizeof → strlenに修正しました。どうもです。


No.16953

Re:テキストファイル内の文字列削除
投稿者---かずま(2004/09/29 20:10:59)


> それと・・プログラム自体にもあまり自信がないので、おかしなところが
> あったらすみませんが教えてください。よろしくお願いします。
filename や tokn が宣言されていません。

dmy = fopen("dmy.txt", "w") に失敗した後、メッセージを表示するだけで
いいのでしょうか?  fprintf(dmy, ...) に行ったらまずいでしょう。

while(1) のループは不要ではないのですか?


int delete_s(const char *filename)
{
    char dday[200], buf[256], *p;
    FILE *fpd, *dmy;
    int  len;
    
    fpd = fopen(filename, "r");
    if (fpd == NULL) goto err2;

    dmy = fopen("dmy.txt", "w");
    if (dmy == NULL) goto err1;

    printf("Type of delete day : ");
    if (fgets(dday, sizeof dday, stdin) == NULL) goto err;

    p = strchr(dday, '\n');
    if (p == NULL) goto err;

    *p = ' ';
    len = strlen(dday);
    while (fgets(buf, sizeof buf, fpd))
        if (memcmp(buf, dday, len)) fputs(buf, dmy);

    fclose(dmy);
    fclose(fpd);
    remove(filename);
    rename("dmy.txt", filename); 
    return 0; /* no error */

err:
    fclose(dmy);
    remove("dmy.txt");
err1:
    fclose(fpd);
err2:
    return 1; /* error */
}



No.16955

Re:テキストファイル内の文字列削除
投稿者---スマイル(2004/09/30 09:23:11)


>filename や tokn が宣言されていません。

すみません。#defineで定義しているためここには書きませんでした。

>dmy = fopen("dmy.txt", "w") に失敗した後、メッセージを表示するだけで
いいのでしょうか? fprintf(dmy, ...) に行ったらまずいでしょう。

あ・・・忘れてました。ご指摘ありがとうございます。

>while(1) のループは不要ではないのですか?

これは削除を一度だけでなく何回も繰り返し行いたかったのでこうしています。

どうもいろいろとありがとうございました。



No.16969

Re:テキストファイル内の文字列削除
投稿者---REE(2004/09/30 14:02:45)


>>while(1) のループは不要ではないのですか?
>
>これは削除を一度だけでなく何回も繰り返し行いたかったのでこうしています。

そうだとしても、今のままでは出来ないでしょう。
おそらく2度目以降の入力は無視されます。



No.16974

Re:テキストファイル内の文字列削除
投稿者---スマイル(2004/09/30 17:00:08)


>そうだとしても、今のままでは出来ないでしょう。
>おそらく2度目以降の入力は無視されます。

あ・・確かに言われてみるとそうですね。
ご指摘ありがとうございます。
ここのループ処理はmain関数のほうでやることにします。