アプリ版:「スタンプのみでお礼する」機能のリリースについて

外部ファイル
123基準あいうえお 基準1かき くけこ 基準2さしす[改行]
45678基準たち つてと 基準1な にぬねの 基準2はひふ へほ[改行]
・・・(以下同様、行によって半角ペースの数が違います。)

上のような日本語を含む外部データがあります。
これをfgetsで1行読み込み、以下のようなことをしたいのですが、C言語ではどのようにすればよいでしょうか?

基準の文字を消し、かつ、基準1,2を含むのそ間の文字
も消し、別のファイルに書き出したい。
基準、基準1,2は各行に1つだけ存在し、全角文字を含みます。

A 回答 (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行のスクリプトだけで、
上記のプログラムとだいたい同じことをします。
(エラーにも強くなります。)
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/08 16:35

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