• ベストアンサー

外部ファイルから一部分を消去したい

外部ファイル 123基準あいうえお 基準1かき くけこ 基準2さしす[改行] 45678基準たち つてと 基準1な にぬねの 基準2はひふ へほ[改行] ・・・(以下同様、行によって半角ペースの数が違います。) 上のような日本語を含む外部データがあります。 これをfgetsで1行読み込み、以下のようなことをしたいのですが、C言語ではどのようにすればよいでしょうか? 基準の文字を消し、かつ、基準1,2を含むのそ間の文字 も消し、別のファイルに書き出したい。 基準、基準1,2は各行に1つだけ存在し、全角文字を含みます。

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

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

だいたい以下のようなプログラムになります。 テストしました。 ですが、エラー処理をしていないので、自信なしにします。 また、日本語コードが、(いわゆる)JISコードだと動かないと思います。 シフトJISやEUCなどなら大丈夫でしょう。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define LINE_MAX 1000 /* 一行の最大長*/ int main(void){ char *line_src;/*加工前の行*/ char *line_dst;/*加工後の行*/ char *base = "基準"; char *base1 = "基準1"; char *base2 = "基準2"; char *b, *b1, *b2; /*基準、基準1、基準2へのポインタ*/ int bl, bl2; /*基準、基準2の長さ*/ FILE *fp_src;/*読み込みファイル*/ FILE *fp_dst;/*書き出しファイル*/ char *p, *q; line_src = (char *)malloc(LINE_MAX); line_dst = (char *)malloc(LINE_MAX); fp_src = fopen("ファイル1.txt", "r"); fp_dst = fopen("ファイル2.txt", "w"); bl = strlen(base); bl2 = strlen(base2); while(fgets(line_src, LINE_MAX, fp_src) != NULL){ /*基準文字列の検索*/ b = strstr(line_src, base); b1 = strstr(line_src, base1); b2 = strstr(line_src, base2); /*本当はここで、b, b1, b2の位置関係が正しいかのチェックが必要。*/ /*文字列を部分ごとにコピー*/ p = line_src; q = line_dst; while(p < b){ *q = *p; p++; q++; } p = b + bl; while(p < b1){ *q = *p; p++; q++; } p = b2 + bl2; while(*p != '\0'){ *q = *p; p++; q++; } *q = '\0'; fputs(line_dst, fp_dst); } return 0; } もっとも、この手の処理はC言語には向いてません。 AWKというツールを使えば { sub("基準", "") sub("基準1.*基準2", "") print } という実質3行のスクリプトだけで、 上記のプログラムとだいたい同じことをします。 (エラーにも強くなります。)

apache6
質問者

お礼

ご回答ありがとうございました。 こちらの環境でも動作確認できました。 AWKという言語は知らなかったので、 こちらも、頑張って習得したいと思います。

関連するQ&A