• ベストアンサー

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

外部ファイル 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

  • 外部ファイルから一部分を書き出したい

    * * 固定文字 * ファイル名1 * [改行] * * 固定文字 * ファイル名2 * [改行] ・・・(以下同様) 上のようなテキストファイルがあります。 これのファイル名1,2,...だけ取り出して 別のファイルに保存したいのですが、 どのようにすればよいでしょうか? *は文字数が変わる文字列を意味します。 *はスペースを含みません。 ファイル名は文字数が変化し、その前後には スペースが入ります。 固定文字はどの行も同じ文字が入っているので これを基準に、プログラムを書けばよいと 思うのですが、分かりません。

  • ファイルの読み込みについて

    アドレス帳をコンソールで作成しようと考えています。 環境は VisualStudi 6.0 です。 住所などの個人情報が書かれたファイルからの読み込みを行うところでつまづいてしまいました。以下がファイルの形式です。 名前(全角) 年齢(半角) 郵便番号(半角) 住所(全角) 電話番号(半角)   ・   ・   ・ となっています。一人一人の情報の間には空行はありません。 これらを行単位で読み込むように fgets を使用して読み込みました。 しかし fgets は改行コードまで含まれてしまうため、改行コードを '\0'と置き換えるような関数を作りました。 void my_strtrim(char *buff1){ while(*buff1 != '\n') buff1++; *buff1 = '\0'; } この関数を付け加え、 fgets 関数の直後に my_strtrim 関数を行うことで読み込んだ文字列の改行コードを削除しようと考えました。 読み込む変数(char型)は直前で各情報毎にmallocにより動的にメモリを確保しています。 そこで実行したとき、なぜか郵便番号を読み込んだ後ののmy_strtrim関数でエラーが出てしまいます。 郵便番号を例えば 333-3333 というようにハイフンを入れた場合にエラーが出るのですが、ハイフンを除き 3333333 とした場合は表示はされるのですが、その後の情報の表示はぐちゃぐちゃになってしまいます。 何が原因なのでしょう?

  • 改行を読み飛ばす

    以下のようなファイルを読み込みたいのですが…. -------------------------------------------------- あいうえを かきくけこ さしすせそ たちつてと -------------------------------------------------- のように1行文字列があって,1行空白行(改行のみ)があって…のような繰り返しのファイルなんですが,空白行を読み飛ばして続けて -------------------------------------------------- あいうえお かきくけこ さしすせそ たちつてと -------------------------------------------------- のように表示させる場合はどのように書いたらよいですか? -------------------------------------------------- while(fgets(str,256,fpin)){   if(strcmp(str,"\n")!=0){    printf("%s\n",str);   } } -------------------------------------------------- と書いたのですが,空白行も表示されてしまいます. 何か間違えているでしょうか? それとも実はファイルの空白行は改行じゃないとかでしょうか?

  • [Ruby]外部ファイルの全角文字削除ができない原因を教えてください

    Rubyでの全角文字削除について質問です。 (環境:Windows XP,cygwin) コマンドライン引数で指定した外部ファイルを読み込んで全角文字を削除しようとすると、 全角文字が削除できないのですが、この原因がわかる方がいらしゃいましたら教えてください。 ・外部ファイル(Shift_JIS,改行=CR+LF) "7桁の| 郵便番号を| 入力して|,ください" ・Rubyスクリプト(cygwin上のため、EUC-JP,改行LF) #file.each_line do |line| # line.gsub!(/ /,'') # line.gsub!(/,/,'') # line.gsub!(/|/,'') #end 全角スペース、全角カンマ、全角パイプラインすべて削除できません。 半角文字は上記方法で削除できます。 しかし、スクリプト中に以下のような記述をすると、 #text = "7桁の 郵便番号を 入力して,ください" #print text.gsub(/ |,/,'') 「7桁の郵便番号を入力してください」と全角文字が削除されて表示されます。 教えてください。 よろしくお願いします。

  • ファイル読み込み EOF 判定

    数字の羅列した単純なテキストファイルを読み込ませたいのですが、 以下のようにすると、途中で改行などで一行あけた場合、そこで読むのを ストップしてしまいます。 if (fgets(buf, sizeof(buf), fp) == NULL) { 改行にくじけることなく、ファイルの最後まで読み込ませるにはどうしたら いいのでしょうか。 ちなみに、以下のようにやると、   while(getc(fp) != EOF){ こんどは改行をものともせず、ファイルのお終いまで読んでくれるのですが、 2バイト文字(頭一文字が化ける)、のっけ一行目に数値(10桁)を置くと 一文字かけて9桁になってしまいます。 2行目以降はちゃんと10桁です。(一行目に改行をいれて、2行目以降に書くと大丈夫のようです。変) 簡単なようで、つまってます。どうかよろしくお願いします。

  • 75オクテットごとに改行を入れる方法

    初めて質問させて頂きます。 iCalendarのデータを吐き出すプログラムを作成中です。 長い項目に関して、75オクテットごとに改行(CRLF)と半角スペースを入れないといけないのですが、方法がわかりません。なお、文字コードはUTF-8で、全角・半角文字がまじっています。 なお、データ中に\nを含む場合は、それがぶった切られないようにする方法はないでしょうか? 具体例) DESCRIPTION:あいうえおかきくけこさしすせそたちつてとなにぬね\nのはひふへほ ↓ DESCRIPTION:あいうえおかきくけこさしすせそたちつてとなにぬね [半角スペース]\nのはひふへほ ※上記のように75オクテット目の\とnが途中で改行されないこと。

    • ベストアンサー
    • Perl
  • ファイルからの全文読み込み

    ファイルから全文読み込むにはどのようにしたらよいのでしょう? ・1行あたり最大100文字まで ・何行あるか不明 ・すべて半角英数字 ・途中に半角スペースあり 全文読み出し、配列に取っておきたいと思いますが、 具体的にどうしたらよいのかわかりません。 fgetsですと最後の1行しか取れませんし・・

  • ファイルから読み出し

    ファイルを読み込んで画面表示するプログラムを作っているのですが、ファイルの扱い?がよくわかりません。 以下のフォーマット・書式とします。 ・フォーマット 番号__氏名__年齢 ・書式 番号:半角3桁まで 氏名:半角/全角問わずで半角20文字/全角10文字まで 年齢:半角2桁まで この場合に、以下のようにするとこの行で止まってしまいます。 特にエラーが出ていないのです。何故なんでしょう? fscanf(*fp,"%3d %20s %2d",&p->no,&p->name,&p->age);

  • txtファイルの読込み時に1033文字を超えると

    txtファイルをfopen_s関数にモード"r"で読み込んでいます。 それをwhile (fgets(~~) != NULL) { ~ } で 1行ずつ読み込んでいるのですが、 この時1行の文字数が半角1033文字を超えていると 1034文字目からが「2行目扱い」になり 予期せぬ困った挙動を起こしてしまいます。 (Windowsのメモ帳では1035文字目から無理矢理改行表示されますが) なぜこの様な事が起こるのでしょうか? どうやって回避するのが一般的なのか教えて頂けますと幸いです。 ※OS:WindowsXP  コンパイラ:Visual C++2008 EE

  • ネット小説の整形

    ネット小説を読んでいると改行がやたら多かったり半角文字と全角文字が入り乱れていて読みにくいので整形して読みたいと思っています。連続した空白行を1つの空白行にして且つ半角文字を全角文字に変換した内容をブラウザに表示できる方法はないでしょうか?