🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

4回答

1191閲覧

【c】segmetationfault のエラーで困ってます.

studyprg

総合スコア57

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2022/09/04 06:23

編集2022/09/04 08:44

やりたいこと

自然言語処理について勉強しています。
Wikipediaのdumpデータから本文を抜き出して処理をしようと思ってます。
segmentation faultがすぐに起きて困ってます.
やりたいこととしては以下です.

・list_history0.txt の各行が欲しい記事の "タイトル" を示している。
・get_X1.txt の各行が (xml ファイル内の記事の ) "タイトル", "id", "開始バイトオフセット", "バイトサイズ" を示している。
・list_history0.txt から一行ずつ読み込み、 get_X1.txt からタイトルが一致する行を探して"開始バイトオフセット", "バイトサイズ"を利用して xml ファイルからその記事を取り出し、「タイトル(タブ)id(改行)記事」を history_0text.txt に書き出す

プログラミングはあまり得意ではないです。

ソースコードとファイル構成

list_history0.txt(get_X1.txtの一部)

日本ゴルフツアー機構 ファイル:十弗駅看板.jpg 桂米朝 国道101号 笑福亭松鶴 リサジュー図形 ムラカ 日淳 井原裕士

次にget_X1.txt

遠山景晋 493646 2948 0 双子 (映画) 1011517 13316 12558 ユダヤ史関連人物の一覧 1855796 18478 68347 Trip trip 56477 87361 0 新銀行東京 615917 91374 90824 東京都道444号下石神井大泉線 61977 144134 143579 野川さくら 1485326 147328 146788 リメンバー・ミー 1740912 231113 230616 ダヒル・リヤレ・カヒン 787401 233208 232520 ソマリランドの大統領一覧 1094317 237068 236399 バルティ 1094317 242216 3511 歌がチカラ 56477 246360 0 トーンチャン 994927 250016 1231 北海道道145号伊達インター線 1428473 251833 0 アクセス禁止 97976 255003 254438 蒲池城 928380 274271 1331 新潟地震 1583832 276296 0 長崎貿易 872478 310391 309847 春牟古丹島 730521 319037 318416 スター誕生! 1873614 325384 324878 サーキット 1037035 456227 455590 Wikipedia:今日は何の日 9月 597321 510011 44598 WP 1617964 555804 2507 栄町駅 (札幌市) 366911 558992 0 北海道中央バス 1599928 574344 573819 広島電鉄1300形電車 6896 668607 668053 柳川鍋 924713 669194 668686 京都市内の通り 191555 676990 37953 由布岳 918416 715450 0 HN 1486874 724007 723488 コンセルヴァトワール 910758 724984 724479 玉川砂記子 1094317 729024 728336 シラガゴケ類 397108 782982 782331 NC 059668 785975 5126 スギゴケ 1781685 791744 0 摂津源氏 990884 794923 794341 NE 262022 805690 805156 NG 1718990 808263 807633 源氏嫡流 279186 810908 810440 魔性の子 1680100 819840 819300 NI 474 844662 844142 NL 104512 846162 845675 翼細胞 208476 847883 847316 NO 230804 848873 848430 多田源氏 990884 850953 850420 NR 786173 863825 863328 フワランポーン駅 1356379 866728 866158 キングカメハメハ 1693773 886601 886041 OM 387704 978075 977510 苔 826261 980849 980395 徐世昌 16765 988907 988200 NY市警緊急出動部隊 トゥルー・ブルー 791294 997442 996895 PE 1627601 1006180 3452 セラミック噴射装置 3751 1010197 0 堀内賢雄 12357 1010829 1010266 筑後宇都宮氏 575671 1197925 1197423 リンカーン (競走馬) 194189 1202581 1201984 PK 703098 1223633 3515 真田町 1231761 1229043 6504 トンファー 503710 1236096 0 情報処理技術者試験 444436 1244748 1244203 キングマンボ 1728221 1308947 1308351 イースター (曖昧さ回避) 120987 1322716 1322186 田中新兵衛 760804 1324023 1323537 PR 703098 1331531 1331062 PT 665832 1336401 1335869 高橋俊昌 291984 1341864 1341250 PW 136753 1350315 1349839 坂城町 685790 1352052 1351543 セレン整流器 1094317 1362107 1361338 ポリアクリルアミドゲル電気泳動 520484 1365670 1365099 シェルピンスキー数 990884 1371139 1370494 はだしのゲン 1126159 1379494 1378926 伊王島町 1338147 1525866 1525301 ノイローゼ 371027 1539066 1538569 原子力発電所 1084393 1540501 1539942 宮崎県総合運動公園第二硬式野球場 320096 1569579 7259 藤田瞳子 1094317 1578500 6210 赤外分光法 1768613 1585235 0 宇都宮清原工業団地 850234 1599642 1599097 樊噲 262022 1603667 1603179 国道385号線 7146 1611313 1610756 深川 1094317 1612117 1611379 碓氷第三橋梁 308365 1616321 5517         //読み込みたいところ 日本ゴルフツアー機構 870371 1623035 25562 ファイル:十弗駅看板.jpg 1780509 1649736 682 桂米朝 1589144 1652031 1217 国道101号 643806 1654059 0 笑福亭松鶴 1143138 1672954 1672423 リサジュー図形 1037035 1682479 1681821 ムラカ 885381 1691394 14441 日淳 1037035 1706472 0 井原裕士 308365 1710132 1709601         //読み込みたいところここまで ソマリア内戦 1037035 1714267 36576 深川 (江東区) 020100 1751367 0 日昇 833366 1764959 1764447 以下略

次にソースコードです.//追記に現在のソースを追加してます.

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE (256 * 1024 * 1024) 5#define MAX_REC (300000) 6typedef struct 7{ 8 char title[256]; 9 char id[128]; 10 int pb1; 11 int pb2; 12} X1_INFO; 13int main() 14{ 15 16 int ll; 17 int i; 18 int x1_ctr = 0; 19 char *p; 20 X1_INFO *wx1; 21 char pb1[16]; 22 char pb2[16]; 23 char *line = malloc(SIZE); 24 char *title = malloc(SIZE); 25 char *id = malloc(SIZE); 26 char *text = malloc(SIZE); 27 char *stitle = malloc(SIZE); 28 X1_INFO *x1ptr = malloc(sizeof(X1_INFO) * MAX_REC); 29 if (x1ptr == NULL) 30 { 31 printf("X1_INFO allocate error\n"); 32 return 10; 33 } 34 FILE *fp = NULL; 35 FILE *fr = NULL; 36 FILE *fr2 = NULL; 37 FILE *gt = NULL; 38 fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "rb"); //大元.wiki記事 39 fr = fopen("list_history0.txt", "r"); //読み込むファイル検索文字列 40 fr2 = fopen("get_X1.txt", "r"); //読み込むファイル2タイトルとidが記入 41 gt = fopen("history_0text.txt", "w"); //書き込むファイル 42 // get_X1を全て読み込む 43 while (fgets(line, SIZE, fr2) != NULL) 44 { 45 if (x1_ctr >= MAX_REC) 46 { 47 printf("Max Record Count Over:%d\n", MAX_REC); 48 return 10; 49 } 50 ll = strlen(line); 51 p = strtok(line, "\t\n"); 52 strcpy(title, p); 53 p = strtok(NULL, "\t\n"); 54 strcpy(id, p); //デバッガによるとここでEXC_BAD_ACCESS (code=1, address=0x0) が発生 55 p = strtok(NULL, "\t\n"); 56 strcpy(pb1, p); 57 p = strtok(NULL, "\t\n"); 58 strcpy(pb2, p); 59 wx1 = x1ptr + x1_ctr; 60 strcpy(wx1->title, title); 61 strcpy(wx1->id, id); 62 wx1->pb1 = atoi(pb1); 63 wx1->pb2 = atoi(pb2); 64 x1_ctr++; 65 } 66 while (fgets(line, SIZE, fr) != NULL) 67 { 68 ll = strlen(line); 69 if (line[ll - 1] == '\n' && ll > 0) 70 line[ll - 1] = '\0'; //改行削除 71 strcpy(stitle, line); 72 printf("Stitle(検索対象)is %s.\n", stitle); 73 for (i = 0; i < x1_ctr; i++) 74 { 75 wx1 = x1ptr + i; 76 if (strcmp(wx1->title, stitle) == 0) 77 { 78 printf("%s is found! title:%s\n", stitle, wx1->title); 79 fseek(fp, wx1->pb1, SEEK_SET); 80 memset(text, 0x00, SIZE); 81 if (wx1->pb2 > 0) 82 { 83 fread(text, 1, wx1->pb2, fp); 84 } 85 printf("%s\t%s\n%s\n\n\n", wx1->title, wx1->id, text);//記事の間を3行開けたい. 86 break; 87 } 88 } 89 if (i == x1_ctr) 90 { 91 printf("%s is not found!\n", stitle); 92 } 93 } 94 printf("\n\n\nprocess ok!\n\n\n"); 95 fclose(fp); 96 fclose(fr); 97 fclose(fr2); 98 fclose(gt); 99}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/09/04 08:44

タグ修正しました。 もしよろしければ解決のお力添えよろしくお願いします
kazto

2022/09/04 09:07

単純に考えて、strtokがトークンを見つけられずにNULLが返却されているのではないでしょうか。 デバッグはしてみましたか?
studyprg

2022/09/04 09:54

デバッグの結果で判明したセグメンテーションが起きた場所はstrcpy (id,p)と記載してますがここがカズトサンが言っていらした場所なんですかね?
ALOHAMS

2022/09/04 23:44

やりたいことは下URLの質問と同じだと思うのですが、解決済みになっています。 https://teratail.com/questions/4fxvbmqpeskxm7 前回と今で変わったところはどこでしょう? そこに原因があると思われます。
studyprg

2022/09/04 23:51

自分としては変えたつもりはないのですが,生成先のファイルの中身が変わっているので生成し直しますね.
studyprg

2022/09/05 10:33

おそらくget_x1.txtが手違いで消えたみたいですね。
guest

回答4

0

今回のソースです。(ソース名が不明なので、教えてください)
MAX_REC を増やしています。(jawiki_titles.txtの行数が既存のMAX_RECを超えたため)
正常終了した場合、不要であれば、ERR_CHECK(1)、ERR_CHECK(2)、ERR_CHECK(3)、ERR_CHECK(4)
をコメントにしてください。(あっても特に問題ないです。)

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE (256 * 1024 * 1024) 5//#define MAX_REC (300000) 6#define MAX_REC (2000000) 7 8typedef struct 9{ 10 char title[256]; 11 char id[128]; 12 long long int pb1; //modify int->long long int 13 long long int pb2; //modify int->long long int 14} X1_INFO; 15#define ERR_CHECK(EP)\ 16{\ 17 if (p == NULL){\ 18 printf("%d行 ERROR%d:<%s>\n",x1_ctr+1,EP,line);\ 19 return 10;\ 20 }\ 21} 22int main() 23{ 24 25 int ll; 26 int i; 27 int x1_ctr = 0; 28 char *p; 29 X1_INFO *wx1; 30 char pb1[16]; 31 char pb2[16]; 32 char *line = malloc(SIZE); 33 char *title = malloc(SIZE); 34 char *id = malloc(SIZE); 35 char *text = malloc(SIZE); 36 char *stitle = malloc(SIZE); 37 X1_INFO *x1ptr = malloc(sizeof(X1_INFO) * MAX_REC); 38 if (x1ptr == NULL) 39 { 40 printf("X1_INFO allocate error\n"); 41 return 10; 42 } 43 FILE *fp = NULL; 44 FILE *fr = NULL; 45 FILE *fr2 = NULL; 46 FILE *gt = NULL; 47 //fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "rb"); //大元.wiki記事 48 fp = fopen("jawiki-20141230-pages-articles.xml", "rb"); //大元.wiki記事 49 fr = fopen("list_history0.txt", "r"); //読み込むファイル検索文字列 50 //fr2 = fopen("get_X1.txt", "r"); //読み込むファイル2タイトルとidが記入 51 fr2 = fopen("jawiki_titles.txt", "r"); //読み込むファイル2タイトルとidが記入 52 gt = fopen("history_0text.txt", "w"); //書き込むファイル 53 // get_X1を全て読み込む 54 while (fgets(line, SIZE, fr2) != NULL) 55 { 56 if (x1_ctr >= MAX_REC) 57 { 58 printf("Max Record Count Over:%d\n", MAX_REC); 59 return 10; 60 } 61 ll = strlen(line); 62 p = strtok(line, "\t\n"); 63 ERR_CHECK(1) 64 strcpy(title, p); 65 p = strtok(NULL, "\t\n"); 66 ERR_CHECK(2) 67 strcpy(id, p); //デバッガによるとここでEXC_BAD_ACCESS (code=1, address=0x0) が発生 68 p = strtok(NULL, "\t\n"); 69 ERR_CHECK(3) 70 strcpy(pb1, p); 71 p = strtok(NULL, "\t\n"); 72 ERR_CHECK(4) 73 strcpy(pb2, p); 74 wx1 = x1ptr + x1_ctr; 75 strcpy(wx1->title, title); 76 strcpy(wx1->id, id); 77 wx1->pb1 = atol(pb1); //modify atoi->atol 78 wx1->pb2 = atol(pb2); //modify atoi->atol 79 x1_ctr++; 80 } 81 while (fgets(line, SIZE, fr) != NULL) 82 { 83 ll = strlen(line); 84 if (line[ll - 1] == '\n' && ll > 0) 85 line[ll - 1] = '\0'; //改行削除 86 strcpy(stitle, line); 87 printf("Stitle(検索対象)is %s.\n", stitle); 88 for (i = 0; i < x1_ctr; i++) 89 { 90 wx1 = x1ptr + i; 91 if (strcmp(wx1->title, stitle) == 0) 92 { 93 printf("%s is found! title:%s\n", stitle, wx1->title); 94 fseek(fp, wx1->pb1, SEEK_SET); 95 memset(text, 0x00, SIZE); 96 if (wx1->pb2 > 0) 97 { 98 fread(text, 1, wx1->pb2, fp); 99 } 100 printf("%s\t%s\n%s\n\n\n", wx1->title, wx1->id, text);//記事の間を3行開けたい. 101 break; 102 } 103 } 104 if (i == x1_ctr) 105 { 106 printf("%s is not found!\n", stitle); 107 } 108 } 109 printf("\n\n\nprocess ok!\n\n\n"); 110 fclose(fp); 111 fclose(fr); 112 fclose(fr2); 113 fclose(gt); 114} 115

上記のソースでatoiをatolに変えました。
環境によってはatolが10桁以上の整数を正しく変換できない場合があります。
念のため、以下のソースを実行して、期待する結果が得られることを確認してください。
test.c

C

1#include <stdio.h> 2#include <stdlib.h> 3int main() 4{ 5 long long int d1; 6 long long int d2; 7 char *p1; 8 char *p2; 9 d1 = atol("1234567890123456789"); 10 d2 = atol("2147483648"); 11 printf("<%lld>\n",d1); 12 printf("<%lld>\n",d2); 13 d1 = strtol("1234567890123456789",&p1,0); 14 d2 = strtol("2147483648",&p2,0); 15 printf("<%lld>\n",d1); 16 printf("<%lld>\n",d2); 17 return 0; 18} 19

期待する結果
<1234567890123456789>
<2147483648>
<1234567890123456789>
<2147483648>

投稿2022/09/08 10:04

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/09/09 03:42

今回のソースです。(ソース名が不明なので、教えてください)→wiki_text _maker.cです。
tatsu99

2022/09/12 01:13

それで、結果はどうなりましたでしょうか。
studyprg

2022/09/13 01:07

ここ最近リアルでバタバタしていたので... testの結果です. % ./test <1234567890123456789> <2147483648> <1234567890123456789> <2147483648> wiki_text_makerはこれです. % ./wiki_text_maker 272054行 ERROR2:</namespace>>
studyprg

2022/09/13 01:08

やっぱり27万2054でエラーですね.
studyprg

2022/09/13 01:13

parserXで生成したファイル(jikken_titles.txt)がおかしいですね. コピペできなかったのでプレヴューから手打ちで再現します. <id>2551</id nor /> 2889 9552 (1).jpg]]&quot; コンな感じです.
tatsu99

2022/09/13 01:16

wiki_text_makerを実行する前に wiki_parserX.c wiki_getterX.c をコンパイルして、そして実行していますか?
tatsu99

2022/09/13 01:20

>parserXで生成したファイル(jikken_titles.txt)がおかしいですね. parserXで生成するのはget_all_byte.txtのはずです。 いきなり、jikken_titles.txtが出てきていますが、何かプログラムをかえたのですか?
studyprg

2022/09/13 14:31

プログラムは変えてないはずです。 実行もparserとgetter後にテキストmaker走らせてるのでさっきの発言と照らし合わせて、ファイルをチェックすると、getterで生成したファイルがおかしいですね。
tatsu99

2022/09/14 01:10

こちらでは、正常に動作しているので、考えられるのは、以下の点です。 1.回答で提示した、wiki_parserX.c、wiki_getterX.cをそのまま使っていない。 (一部のみあなたのwiki_parserX.cに取り込んで使っている等) 回答で提示した、wiki_parserX.c、wiki_getterX.cをそのまま、コンパイルしてください。 (ソースを変更しないでください) 2.こちらで使用したデータとあなたが使用したデータが違っている。 こちらで、使用したデータの日付とサイズです。 サイズが合っているか、確認してください。 もし、異なるなら、あなたの環境のデータの日付とサイズを提示してください。 下記の3ファイルのサイズを確認してください。 ls -l と入力すると下記の形式で表示されます。 -rw-r--r--. 1 yuni1 yuni1 8563118547 9月 8 16:23 jawiki-20141230-pages-articles.xml -rw-r--r--. 1 yuni1 yuni1 79688215 9月 14 10:04 get_all_byte.txt -rw-r--r--. 1 yuni1 yuni1 92282620 9月 14 10:06 jawiki_titles.txt
studyprg

2022/09/25 08:04

ちょっとリアルで色々ありすぎたためこちらに手が回りませんでした. 現在アドバイスに沿って実行中です.
studyprg

2022/09/25 08:19

一応うまく動いたっぽいです.ベストアンサーにしました.
studyprg

2022/09/25 08:21

動きはしたんですけどcmdに表示された文字列がファイルへの書き込みができてないですね.
guest

0

2G越えのファイル対応版です。
wiki_parserX.c

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE (256 * 1024 * 1024) 5 6int main() 7{ 8 9 long long int p,pb[6] = {0,0,0,0,0,0}; //modify int->long long int 10 char *line = malloc(SIZE); 11 char *title; 12 char *id; 13 char *titletext; 14 char *idtext; 15 char *t0; 16 char *t1; 17 int tlen; 18 //FILE *fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); 19 FILE *fp = fopen("jawiki-20141230-pages-articles.xml", "r"); 20 FILE *fw = fopen("get_all_byte.txt", "w"); //記入先 21 if ((NULL == fp) || (NULL == fw)) 22 { 23 printf("ファイル読み込み失敗!!!!!!!!!!!!\n"); 24 abort(); 25 } 26 while (p = ftell(fp), fgets(line, SIZE, fp)) 27 { 28 29 // title 30 if (t0 = strstr(line, "<title>")) 31 { 32 // printf("title(patarn1) found.\n"); 33 pb[0] = p; 34 if ((t1 = strstr(line, "</title>"))) 35 { 36 // printf("/title(patarn1) found.\n"); 37 tlen = t1 - t0 - strlen("<title>"); 38 pb[0] = p + t0 -line + strlen("<title>"); 39 pb[1] = tlen; 40 pb[2] = 0; 41 pb[3] = 0; 42 continue; 43 } 44 } 45 // id用 46 if (t0 = strstr(line, "<id>")) 47 { 48 if (pb[2]!= 0) continue; 49 if ((t1 = strstr(line, "</id>"))) 50 { 51 tlen = t1 - t0 - strlen("<id>"); 52 pb[2] = p + t0 -line + strlen("<id>"); 53 pb[3] = tlen; 54 continue; 55 } 56 } 57 58 // text 59 if (t0 = strstr(line, "<text")) 60 { 61 t0 = strchr(t0,'>'); 62 pb[4] = p + t0 -line + 1; 63 } 64 65 if (t1 = strstr(line, "</text>")) 66 { 67 pb[5] = p - pb[4] + t1 -line; 68 } 69 if (pb[0] > 0 && pb[1] > 0 && pb[2] > 0 && pb[3] > 0 && pb[4] > 0 && pb[5] > 0) 70 { 71 //printf("pb[0](title seek point):%d\npb[1](title size):%d\npb[2](id start point):%d\npb[3](id size):%d\npb[4](text start point):%d\npb[5](text size):%d\n\n\n\n", pb[0], pb[1], pb[2], pb[3], pb[4], pb[5]); //目的達成のため,値を初期化 72 fprintf(fw,"%lld\t%lld\t%lld\t%lld\t%lld\t%lld\n",pb[0],pb[1],pb[2],pb[3],pb[4],pb[5]); 73 pb[0] = 0; 74 pb[1] = 0; 75 pb[2] = 0; 76 pb[3] = 0; 77 pb[4] = 0; 78 pb[5] = 0; 79 } 80 } 81 printf("process ok"); 82 free(line); 83 fclose(fw); 84 fclose(fp); 85} 86

wiki_getterX.c

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE (256 * 1024 * 1024) 5int main() 6{ 7 8 //int p, p1 = 0; //delete 9 long long int pb[6] = {}; //modify int -> long long int 10 char *line = malloc(SIZE); 11 char *title = malloc(SIZE); 12 char *id = malloc(SIZE); 13 FILE *fp = NULL; 14 FILE *fr = NULL; 15 FILE *gt = NULL; 16 //fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "r"); 17 fp = fopen("jawiki-20141230-pages-articles.xml", "r"); 18 fr = fopen("get_all_byte.txt", "r"); //読み込むファイル 19 //gt = fopen("get_X1.txt", "w"); //書き込むファイル 20 gt = fopen("jawiki_titles.txt", "w"); //書き込むファイル 21 while (fscanf(fr, "%lld\t%lld\t%lld\t%lld\t%lld\t%lld\n", &pb[0], &pb[1], &pb[2], &pb[3], &pb[4], &pb[5]) != EOF) 22 { 23 fseek(fp, pb[0], SEEK_SET); 24 fread(title, 1, pb[1], fp); //タイトル取得 25 title[pb[1]] = '\0'; 26 fseek(fp, pb[2], SEEK_SET); 27 fread(id, 1, pb[3], fp); // id取得 28 id[pb[3]] = '\0'; 29 fprintf(gt, "%s\t%s\t%lld\t%lld\n", title, id, pb[4], pb[5]); 30 } 31 printf("process ok"); 32 free(line); 33 free(title); 34 free(id); 35 fclose(fp); 36 fclose(fr); 37 fclose(gt); 38} 39

投稿2022/09/08 09:53

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のようにしてください。
エラー発生時のget_X1.txtの行番号、読み込んだ1行の内容を表示して、処理を停止します。
元のソースはバックアップを取っておいてください。

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#define SIZE (256 * 1024 * 1024) 5#define MAX_REC (300000) 6typedef struct 7{ 8 char title[256]; 9 char id[128]; 10 int pb1; 11 int pb2; 12} X1_INFO; 13#define ERR_CHECK(EP)\ 14{\ 15 if (p == NULL){\ 16 printf("%d行 ERROR%d:<%s>\n",x1_ctr+1,EP,line);\ 17 return 10;\ 18 }\ 19} 20int main() 21{ 22 23 int ll; 24 int i; 25 int x1_ctr = 0; 26 char *p; 27 X1_INFO *wx1; 28 char pb1[16]; 29 char pb2[16]; 30 char *line = malloc(SIZE); 31 char *title = malloc(SIZE); 32 char *id = malloc(SIZE); 33 char *text = malloc(SIZE); 34 char *stitle = malloc(SIZE); 35 X1_INFO *x1ptr = malloc(sizeof(X1_INFO) * MAX_REC); 36 if (x1ptr == NULL) 37 { 38 printf("X1_INFO allocate error\n"); 39 return 10; 40 } 41 FILE *fp = NULL; 42 FILE *fr = NULL; 43 FILE *fr2 = NULL; 44 FILE *gt = NULL; 45 fp = fopen("jawiki-20211220-pages-articles-multistream2.xml", "rb"); //大元.wiki記事 46 fr = fopen("list_history0.txt", "r"); //読み込むファイル検索文字列 47 fr2 = fopen("get_X1.txt", "r"); //読み込むファイル2タイトルとidが記入 48 gt = fopen("history_0text.txt", "w"); //書き込むファイル 49 // get_X1を全て読み込む 50 while (fgets(line, SIZE, fr2) != NULL) 51 { 52 if (x1_ctr >= MAX_REC) 53 { 54 printf("Max Record Count Over:%d\n", MAX_REC); 55 return 10; 56 } 57 ll = strlen(line); 58 p = strtok(line, "\t\n"); 59 ERR_CHECK(1) 60 strcpy(title, p); 61 p = strtok(NULL, "\t\n"); 62 ERR_CHECK(2) 63 strcpy(id, p); //デバッガによるとここでEXC_BAD_ACCESS (code=1, address=0x0) が発生 64 p = strtok(NULL, "\t\n"); 65 ERR_CHECK(3) 66 strcpy(pb1, p); 67 p = strtok(NULL, "\t\n"); 68 ERR_CHECK(4) 69 strcpy(pb2, p); 70 wx1 = x1ptr + x1_ctr; 71 strcpy(wx1->title, title); 72 strcpy(wx1->id, id); 73 wx1->pb1 = atoi(pb1); 74 wx1->pb2 = atoi(pb2); 75 x1_ctr++; 76 } 77 while (fgets(line, SIZE, fr) != NULL) 78 { 79 ll = strlen(line); 80 if (line[ll - 1] == '\n' && ll > 0) 81 line[ll - 1] = '\0'; //改行削除 82 strcpy(stitle, line); 83 printf("Stitle(検索対象)is %s.\n", stitle); 84 for (i = 0; i < x1_ctr; i++) 85 { 86 wx1 = x1ptr + i; 87 if (strcmp(wx1->title, stitle) == 0) 88 { 89 printf("%s is found! title:%s\n", stitle, wx1->title); 90 fseek(fp, wx1->pb1, SEEK_SET); 91 memset(text, 0x00, SIZE); 92 if (wx1->pb2 > 0) 93 { 94 fread(text, 1, wx1->pb2, fp); 95 } 96 printf("%s\t%s\n%s\n\n\n", wx1->title, wx1->id, text);//記事の間を3行開けたい. 97 break; 98 } 99 } 100 if (i == x1_ctr) 101 { 102 printf("%s is not found!\n", stitle); 103 } 104 } 105 printf("\n\n\nprocess ok!\n\n\n"); 106 fclose(fp); 107 fclose(fr); 108 fclose(fr2); 109 fclose(gt); 110} 111

エラー発生時に表示される内容のサンプルです。
3行 ERROR4:<産業奨励会館 114800>

投稿2022/09/05 07:25

編集2022/09/05 07:28
tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2022/09/05 07:35

エラーの行が判ったら、その行をエディタで表示して内容を確認してください。 その際、タブとスペースの違いが表示されるエディタがよいです。 (タブもスペースも同じように表示されるとどこが悪いのかがわかりません)
studyprg

2022/09/05 10:32

具体的には何が良いのでしょうか? あとget_x1.txtにあたるものが文字化けしてるみたいです。 コピーも出来ないしutf -8ではないので標準のエディターで開かないみたいです
tatsu99

2022/09/05 10:59 編集

>具体的には何が良いのでしょうか? エラーが全く発生せずに、プログラムが正常終了することが良いことです。 プログラムにエラーの原因があるわけではなく、get_x1.txtの内容がおかしいことが、原因です。 get_x1.txtがutf-8の文字コードで、1行が、「文字列<tab>文字列<tab>文字列<tab>文字列<改行>」 で構成されていれば良いです。 あなたの実行環境(OS,コンパイラ、エディタ)は、どうなっていますか。 当方は、OSがLinux(centos7.5)  コンパイラがgcc エディタがviもしくはemacsを使用しています。 >コピーも出来ないしutf -8ではないので標準のエディターで開かないみたいです get_x1.txtを作成した直後から、おかしいのですか? 以前は、正しく作成できていたと思いますが、なにか、作成方法を変えたのですか?
tatsu99

2022/09/05 11:10

あなたは、get_x1.txtの内容を 遠山景晋 493646 2948 0 双子 (映画) 1011517 13316 12558 ・・・以下省略・・・ のように提示していますが、このデータは正しい、utf-8のデータではないのでしょうか。 どのようにして、このデータを提示されたのでしょうか。
studyprg

2022/09/06 06:58

tatsuさん  どのようにして、このデータを提示されたのでしょうか。>以前のうまくいっていたデータの一部があったのでそれを提示してます. あなたの実行環境(OS,コンパイラ、エディタ)は、どうなっていますか。>MacBookPro(OS:11.6.7),VisualStudioCodeを使ってます. 以前は、正しく作成できていたと思いますが、なにか、作成方法を変えたのですか?> 正確に覚えてはないのですが提示しているプログラムを実行した際にタイトルを書き込んだファイルが空で分が空のファイルが生成されてしまったのだと考えられます.
studyprg

2022/09/06 07:13

生成したファイル(get_X1に相当するもの)がBINARYファイルになってました. プレヴューからはちゃんと見えています.
tatsu99

2022/09/06 07:26 編集

macは使用していないのわかりませんが、エディタでそのファイルは表示できないのでしょうか? 以前はどうやってget_X1.txtの内容を確認したのでしょうか。同じ方法で確認すれば良いと思います。
studyprg

2022/09/06 07:30

nkfでutf-8に変換した結果,一部の文字化けは治りましたが,途中から文字化けし始めました. 下が化た文字列です. 蜒壻シ夊ュー|label= 髢」蜒壻シ セミイ ミ 2147438125 12890 ム⇦ク ↓螟画2147451632 25 育憾豕√轡篋2147452193 21940 ソ艦船の衝 ing inc 2147474828 24 ュヲ蛯呵茘y闃2147475463 27 縺ゅ>縺璢 豬キ霆崎 2147475994 1875 ス騾」濶ヲ縺ッ縺溘□縺。縺 。繝ェ繧ォ 2147478417 1910 茶閭ス蜉帙′莉倅ク弱&2147480955 3240
studyprg

2022/09/06 07:39

一応回答の実行結果です. 272054行 ERROR2:</namespace>>
tatsu99

2022/09/06 08:15

https://teratail.com/questions/4fxvbmqpeskxm7 の回答をたどると 手順1.(wiki_parserX.c) jawiki-20211220-pages-articles-multistream2.xmlを読み込み get_all_byte.txt を作成。 手順2.(wiki_getterX.c) jawiki-20211220-pages-articles-multistream2.xml 及び get_all_byte.txt を読み込み get_X1.txt を作成。 こちらでファイルサイズを確認すると -rw-r--r--. 1 yuni1 yuni1 1536346973 7月 4 22:13 jawiki-20211220-pages-articles-multistream2.xml -rw-r--r--. 1 yuni1 yuni1 6935611 9月 6 17:05 get_all_byte.txt -rw-r--r--. 1 yuni1 yuni1 7538756 9月 6 17:06 get_X1.txt get_X1.txtの行数は wc get_X1.txt 171490 705838 7538756 get_X1.txt となり171490行です。 jawiki-20211220-pages-articles-multistream2.xml get_all_byte.txt get_X1.txt のファイルサイズは、あなたの環境のファイルサイズと一致してますか。 又、get_X1.txtの行数は171490行ですが あなたの環境では、何故、272054行もあるのか不思議です。 手順1,手順2以外の方法でget_X1.txtを作成されたのですか。 jawiki-20211220-pages-articles-multistream2.xml を元データとして使っていないのですか。
studyprg

2022/09/06 10:56

手順1,手順2以外の方法でget_X1.txtを作成されたのですか。> 同様の方法で作成したと思います. awiki-20211220-pages-articles-multistream2.xml を元データとして使っていないのですか。> 今は一つのファイルとして扱えるjawiki-20141230-pages-articles.xmlを利用しています.(友人より譲り受けました.) これを利用してgetX1を作成しました.
studyprg

2022/09/06 11:03

文字化けしている箇所は272054行目でした.ここはエラーメッセージと同じ行です. get_X1.txtにあたるファイルのそのあたりを表示しておきます. クリヴァク型フリゲート 401225 2147424656 66776//272053行目 /namespace> etter"> 1658 55 case="first-letter">Portal</namespa ase="fi 2442 55 Oxhop</username> <id>2551 <minor 3223 55 &lt;/em&gt;&lt;/l 0日 3988 55 :EF型写真:V &gt;09: 4663 1602 セ縺励◆縲&lt;em&gt;(罨ф き 6878 32 利用者:Grimlin|Grimlin]] &quot;[[:薙ご繝ゥ 7588 280 閠Grimlin|Grimlin]] &quot;[[:画像:アカツ繩ャ繝「.jp 8555 317 ; &lt;li&gt;14:21 200 n|Griml 9339 1617 ibbon|Ribbon]] &quot;[[:逕サ蜒Kameido_eki r繧「繝 11636
tatsu99

2022/09/06 11:45

>今は一つのファイルとして扱えるjawiki-20141230-pages-articles.xmlを利用しています.(友人より譲り受けました.) >これを利用してgetX1を作成しました. どのようにして作成したのでしょうか。 手順1.(wiki_parserX.c) jawiki-20141230-pages-articles.xmlを読み込み get_all_byte.txt を作成。 手順2.(wiki_getterX.c) jawiki-20141230-pages-articles.xml 及び get_all_byte.txt を読み込み get_X1.txt を作成。 でしょうか。 そうであれば、途中から文字化けするのは考えにくいのですが・・・・。 jawiki-20141230-pages-articles.xml自体が途中から文字化けしているなら話は別です。
tatsu99

2022/09/07 00:25

>今は一つのファイルとして扱えるjawiki-20141230-pages-articles.xmlを利用しています. こちらでも、確認してみますので jawiki-20141230-pages-articles.xml を https://firestorage.jp/ にアップしてしただけませんでしょうか。 ファイルサイズが大きいので、アップの際はzip形式で圧縮したものをアップしてください。
studyprg

2022/09/07 05:40

アップしようとしましたが圧縮後が2,8GBほどありアップできませんでした. あとgetX1に相当するものは名前を変えないとまた手違いで消えると困るので... jawiki_titles.txtにしようかと思ってます.
tatsu99

2022/09/07 07:34

>アップしようとしましたが圧縮後が2,8GBほどありアップできませんでした. ファイルを分割してアップしてください。 split --bytes=1500M 圧縮したファイル名 jawikizip とすると、1500M=1.5G単位で分割されます jawikizipaa jawikizipab の2ファイルができるのでこれをアップしてください。 アップする前に、念のために正しく分割されているかの確認のため、 1.分割したファイルの結合 (allという名で結合) cat jawikizipaa jawikizipab > all 2.allと圧縮したファイル名の比較(差異がないこと) cmp all 圧縮したファイル名 でエラー表示がなければOK
tatsu99

2022/09/07 08:07

>あとgetX1に相当するものは名前を変えないとまた手違いで消えると困るので... >jawiki_titles.txtにしようかと思ってます. 以下の手順で作成するということで、間違いないでしょうか。 手順1.(wiki_parserX.c) jawiki-20141230-pages-articles.xmlを読み込み get_all_byte.txt を作成。 手順2.(wiki_getterX.c) jawiki-20141230-pages-articles.xml 及び get_all_byte.txt を読み込み jawiki_titles.txt を作成。
studyprg

2022/09/07 09:09

行いました. https://fire.st/0rD9b4v 1.split -b 1500m jawiki-20141230-pages-articles.xml jawikizip 2.catもしました.
studyprg

2022/09/07 09:09

今あげているので少し待ってください.
studyprg

2022/09/07 09:38

アップローど完了しました 以下の手順で作成するということで、間違いないでしょうか。> 間違い無いです.
tatsu99

2022/09/07 10:11

https://fire.st/0rD9b4vを見ました。 jawikizipaa~jawikizipafまで6ファイルあります。合計約7.9Gになります。 申し訳ありませんが、 jawiki-20141230-pages-articles.xml ではなく zip形式に圧縮したファイルを分割してアップしていただけませんでしょうか。 こちらの回線契約のSIMの容量が少ないので、7.9Gを読み込むのは難しいです。 約2.8Gときいていたので、それなら何とかダウンロードできます。
studyprg

2022/09/08 05:50

分割したファイルを圧縮したものをアップします.
studyprg

2022/09/08 05:55

リンク>https://fire.st/0rD9b4v アップできました.合計で2.8GBあります.これでいけると思います.
tatsu99

2022/09/08 06:31

ありがとうございます。ダウンロードします。
tatsu99

2022/09/08 07:47

ダウンロードが完了し、 jawiki-20141230-pages-articles.xmlを入力データとして wiki_parserXとwiki_getterXを実行しました。 結果は、jawiki_titles.txtが正しく生成されませんでした。 jawiki_titles.txtの 272053行 クリヴァク型フリゲート の次のデータがこわれています。 原因は、 1.jawiki-20141230-pages-articles.xml がおかしい。 2.jawiki-20141230-pages-articles.xmlは正しいが、 wiki_parserX又はwiki_getterXのいづれかがおかしい。 のどちらかです。 とりあえず、中間報告まで。
tatsu99

2022/09/08 09:50

原因がわかりました。 jawiki-20141230-pages-articles.xmlのサイズが2Gを超えているため、エラーが発生しています。 SEEKをするときに、int型の変数だと最大2Gまでの数値しか対応できません。 従って、SEEK関連の変数は64ビット型整数にする必要があります。 対応したソースを次の回答でアップします。
guest

0

エラーは発生した箇所は、下記の行でしょうか。
strcpy(id, p); //デバッガによるとここでEXC_BAD_ACCESS (code=1, address=0x0) が発生
そうであれば、その時の読み込んだ1行(line)の内容が、どうなっているか確認してください。
1行の内容は
文字列<tab>文字列<tab>文字列<tab>文字列<改行>
のようになっていなければいけません。
get_X1.txtの中に、上記のようになっていない行がありませんか。

投稿2022/09/04 11:57

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

studyprg

2022/09/04 15:31

get_X1.txt確認します
studyprg

2022/09/04 23:48

改行がおかしいことになっているので生成し直しますね
studyprg

2022/09/05 06:47

printfでidとpを表示しますと ================= dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dd dddd dd dd ==================================
tatsu99

2022/09/05 07:22

知りたい情報は、get_X1.txtの何行目でエラーが起こっているかです。 従って、x1_ctrとlineの内容です。 printfのサンプルを次の回答で示します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問