掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
読み込んだテキストファイルの配列化するには? (ID:52644)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>> なーめさん、レス遅くなってすいません。 >> 自力でやろうとしてたもんで、しばらくここをチェックしていませんでした。 いえいえ、 私もちょうどいいタイミングでした。 なにせ windows 2000 の再インストールしてたもので。 >>いかにもバカっぽいので〜 中級クラスにさしかかったばかりの人の意見でしょうな。 目的のコードをできるだけ早く仕上げることを求められることが なかったのだと思います。仕事でコードを書いているとその ような場面に出くわすことはよくあります。 ソースに文字列を組み込むのは使い捨てコードの場合で、 汎用性がまったくないものです。このようなプログラムを書くときは 超バカに徹して、さっくりとデータとりを行います。 そのようなプログラムは使い終わったら削除です。 見栄えにこだわって有効な手段をなきものにしてしまうのは惜しいです。 ところで、 >> 根本的にこのやり方自体がいただけないんでしょうか? はい。 メモリの確保が足りません。 (1) >> text=new char*[line]; //lineは、data.txt内の記述行数 (2) >> text=new char[1024]; ^^^^ --- moji ですね。 >> でメモリを確保します。 (1) はポインタ配列のメモリを確保しています。 (2) は fgets() の一時記憶域を確保しています。 変数 text は 1024 個のポインタの記憶域を確保しているだけであり、 文字列の記憶域を確保しているわけではありません。 なので、 (3) text[0] ... text[1023] の文字列記憶域を確保する必要があります。 for( c = 0; c < 1024; c ++ ) { text[c] = new char[1024]; } ... 下の例では strdup() を使って確保しています。 次に、 入力テキストが ","(半角、カンマ) で区切られているならば、strtok() が 使えますが、"。" (全角、句読点など)の場合は正しく動作しないと思われます。 strtok() のような ascii 系は 半角文字だけのデータには都合がいいのですが、 日本語処理を行うなら、役に立たない関数だと思っています。 それからね、 fclose(fp); // クローズ なんてコメントは入れるものではありません。 見ればわかるのです。他人が見てわからないかもしれないと思うところに コメントを入れます。 私なら次のように書きます。 なお、コンパイル、テストはしていません。 FILE * fp; // 次の s は moji に相当しますが、new する必要はなく、 // ローカルスタック宣言で十分です char s[1024]; char bs[1024]; char * p; char * q; int lines_used = 0; unsigned char b; bs[0] = 0; if( fp = fopen( "data.txt", "r" )) { while( fgets( s, 1024, fp )) { if( p = strchr( s, 0x0A )) *p = 0; // 改行コード除去 strcat( bs, s ); for( p = q = s; *s; p ++ ) { b = (unsigned char *)p; if( *p == ',' ) { *p = 0; // カンマのところで文字列を切断する text[lines_used++] = strdup( q ); q = p + 1; // 切断した次の文字 } else if(! strcmp( p, "。" )) { *p = 0; // 句点のところで文字列を切断する text[lines_used++] = strdup( q ); p ++; // 漢字2バイト目をスキップ } else if(( 0x80 < b ) && ( b < 0xBF ) || ( 0xE0 <= b ) && ( b < 0xFD )) { p ++; // 漢字2バイト目をスキップ } } for( q = bs; *p;) // 未処理部分を前に詰めなおす { *q++ = *p++; } *q = 0; // ヌル終端 } if( strlen( bs )) // 最後の文をとり忘れないように! { text[lines_used++] = strdup( q ); } fclose( fp ); return( TRUE ); } return( FALSE ); >> ちなみに、自然言語です。 私もでした。10年以上前だけど。 追伸、 確保したメモリを delete や free() するのを忘れないでね。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.