10秒目をつむったら…

大量のhtmlファイルを処理をする様になってから今迄はperlを使って来
たが処理が遅いのでC言語を使って早くしようと思って要るが。肝心の
日本語コードの扱いで詰まっている。

例えば、
<!--コメントヘッダーのはじまり-->
.
.
.
<!--コメントヘッダーのおわり-->
と言った場合に、<と>に囲まれた色んなタグが現れて来る。strtokで文
字列を拾って対処をするとしても、文字コードが処理出来なければ何も
進まない。

例えば、上記の場合でhtmlファイルを読んでコメントヘッダーのはじまり
とおわり迄に関しては、出力をしない。他のは全て出力すると言う様な場
合のC言語のソースはどの様に成るのでしょうか。

済みません。未だ、始めたばかりでC言語での記述が出来ません。宜し
く回答願います。

回答はヒントでは無くて直接のC言語のソースを提示願います。宜しく
お願いします。

質問者からの補足コメント

  • うーん・・・

    今回の場合は、ヒントとかと言うのはどうしても長い説明にならざるを
    得ません。ですから、ここではコードでのサンプルを提示願います。

    そうでないと聞き取りミス、説明不足などと言う注意ミスの発生も有り
    かなりにそれなりの理解に対するコストが増えます。そんな所での苦労
    は避けたい物です。

    ですから、ここでは直接のコードと言うのを要求しています。具体的に解説
    をされても何一つとしてそこにコードが無い物は、理解が難しいと言う事を
    ここでは回答をされる万は理解をして下さる様切にお願いします。

    宜しくお願いします。質問をされる方へ幾ら質問をしても何度も質問をされる
    方の私は、どう答えれば良いのか苦慮します。回答者の回答者なりの範囲で回答
    をお願いします。私ならば、この様に作リますとか。

    それで良いです。兎に角、ここではコードが無い様では先に話が進みません。
    宜しくお願いします。

      補足日時:2017/02/21 05:54
  • うーん・・・

    取り敢えずは、最初の一歩としては先ずはファイルの出力から。下記の
    内容です。これに、タグを見つけて条件を付けてからの出力となりま
    す。

    #include <stdio.h>
    #include <stdlib.h>

    int main() {
    int getf;
    FILE *fp;

    fp = fopen("01.txt" , "r");
    if (fp == NULL) {
    printf("ファイルが開けませんでした");
    exit (1);
    }
    while(1) {
    getf = fgetc(fp);
    if (getf == EOF) break;
    printf("%c" , getf);
    }

    fclose(fp);
    return 0;
    }

      補足日時:2017/02/21 11:30
  • うーん・・・

    未だ勉強を始めたばかりで、この質問以前の段階ですので
    再度質問を改めて提出します。

    一旦、これは閉じます。

      補足日時:2017/02/21 12:55

A 回答 (1件)

>回答はヒントでは無くて直接のC言語のソースを提示願います。



これがほしければ、もうちょっと具体的な入出力についての説明が必要です。

ヒントレベルになりますが、状態変数を使って、
状態1:コメント外・・・strstr()などを使って"<!--"を探し、そこまでを出力→状態2へ
状態2:コメント内・・・strstr()などを使って"-->"を探し、その一つ右へポインタを進める→状態1へ
これをHTMLの最後まで繰り返します。

ファイルの中身をすべていったんメモリに持つなら'\0'を見つけるまで繰り返すだけです。限られたバッファでやりくりしようとするなら(ネットワークからダウンロードしながら処理する際にはこのやり方が必須)、バッファ読み込みの際のタグ文字列の泣き別れなどを考慮する必要がありちょっと凝ったテクニックが必要になります。

それとも、UTF-8で書かれたHTMLの"<!--コメントヘッダーのはじまり-->"~"<!--コメントヘッダーのおわり-->"を全削除ですか?だったら、コードをUTF-8で書いて、strstr()で"<!--コメントヘッダーのはじまり-->”を見つけて・・・でいけると思います。文字コードの処理というよりか、見る人が見れば日本語に見えるかもしれない「ただのデータの列」とみなして処理するだけです。
    • good
    • 0
この回答へのお礼

有難う御座います。

折角回答頂きましたが。具体的に理解を得る事は難しいです。私が回答
者ならば、ここではそんな紛らわしい回答はしませんが。

ここではきちんとした正解を得るのが目的では無くて、ざっくりとした
概要を知るのが目的ですから。ですから、抽象的な回答では前には進め
ません。

何でも良いので、動くので有れば。動くので有れば私なりに理解が出来
る範囲で理解に努めます。然し、何も無い様で有れば何も理解にはなり
ません。確かに、ヒントで書かれている内容は理解は出来ます。

何もそんな難しいどの様な状況下でも動くコードを求めている訳では有
りません。これを実現する方法は人に依って多種多様です。その全ての
回答を列挙してその全ての解説なんかを求めている訳では有りません。

何でも良いのです。動きさえすれば。何でも良いのでサンプルが知りた
かったと言うのが趣旨です。やり方としては。

① strstrを使って、<を探す。
② !--のコメントタグなのかをチェックする
③ コメントタグならば、コメントの内容がコメントヘッダーのはじま
りか、若しくはコメントヘッダーのおわりかをチェックする。
④ 該当が有れば、次のタグが-->なのかをチェックする
⑤ 若しもそこでも該当すれば、出力非表示のフラグをセットする。
⑥ 次のデータを読んで、終わりの今度はまた、終了タグの<をチェッ
クする。
⑦ <が見つかると、次のコメントヘッダーのおわりを探す。
⑧ それが見つかると、終了タグの-->を探す
⑨ 終了タグ迄見つかると、出力非表示のフラグをリセットする
⑩ 次からは通常の出力モードに移行する
⑪ この動作を入力が無くなる迄繰り返す。

と言う様なダラダラとした長い説明になります。また、これではどうし
ても説明が理解を得る事が難しくなります。だから、百聞は一見に如か
ずで直接のコードでの回答が理解がしやすのです。

この様な説明をしても聞いている方が効率良く理解をするとは到底思えま
せん。だから、私はコードでの回答をお願いしますと言ったのです。

私なら、若しも私が知っていると言うので有ればここではさっさとコー
ドを提示します。それが親切と言う物です。幾ら例え回答をしても質問
をされている方が理解が得られ難い様で有れば、それは回答をしたとし
ても質問者の意に反します

お礼日時:2017/02/21 05:42

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


おすすめ情報