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関数のほうでやることにします。 |