自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
xmlの処理について試しているのですが、出力結果が想定とは全然違って困っています。
欲しい出力は,,<page>~~</page>の中身です。
segmetation faultが治らず困っています。
プログラミングはあまり得意ではないです。
以下にソースコードを貼り付けます。
#include <stdio.h> #include <stdlib.h> #include <string.h> int main (){ int p=0; char pb[5]={}; char line[BUFSIZ];//vsstudioにより1024と判明 FILE *fp =NULL; FILE *fw =NULL; fp=fopen("jawiki-20211220-pages-articles-multistream2.xml" , "r");//wiki char title[BUFSIZ]; //FILE *gt=fopen("list_1.txt","r"); fw = fopen("get_text_c.txt", "w");//書き込み先 if ((NULL == fp)||(NULL== fw )){ printf("abootしました。"); abort();//終了、ここがうまくいってない? } while (p = ftell(fp), fgets(line, BUFSIZ, fp)) { if (strstr(line, "<page>")){ pb[0]=p; } else if (strstr(line, "</page>")){ pb[1] = p - pb[0]+1; fseek(fp,-pb[1],SEEK_CUR); fprintf(stderr, "start=%d size=%d BUFSIZ=%d\n", pb[0], pb[1], BUFSIZ); // printf("%d",fp); fgets(line,pb[1],fp); //fwrite(pb, sizeof(size_t), 2, fw); // ... //fprintf(fw, "%hhd \t %hhd \n", pb[0], pb[1]); //... 名残 fprintf(fw,"%s \n",line); } } fclose(fw); fclose(fp); }
次に出力ファイル(5行ほど)です。
get_text_c.txt
1>chmmooepsrvwuo4n0ziki50nn5rvhj7</sha1> 2 3>chmmooepsrvwuo4n0ziki50nn5rvhj7</sha1> 4 5>chmmooepsrvwuo4n0ziki50nn5rvhj7</sha1> 6 7>chmmooepsrvwuo4n0ziki50nn5rvhj7</sha1> 8
BUFSIZいくつ? xml読み込むのに十分大きい?
このプログラムを作る前にxmlファイル内の記事の始点から終点のバイトを読み込むプログラムを作成した時はしっかり動きましたので大丈夫だと思います。
しっかり動いたときと同じかそれ以上のBUFSIZなんですね?
多分そうだと思います。
他の方にバッファサイズ拡張したらと指摘されているので不安です。
(1) fpがNULLかどうかは、ftellやfgetsにfpを渡す前にチェックしなければなりません。
(2) pbの各要素はcharなので、pの値を代入したりpとの差を計算した値を代入するには不適です。
(3) ftell関数の説明に、戻り値の差が文字数と一致するとは限らない、といった注意が書かれているはずです。
ありがとうございます ちょっと動かして確認してみます
bufsizは1024でした。
色々修正しました。
回答1件
あなたの回答
tips
プレビュー