• ベストアンサー

単語を読み取る(c言語)

テキストファイルから英単語を読み取るプログラムを考えています。 fgets()だと一行読み取ってしまい、上手くいきませんでした。 初心者の私ですが、教えていただけませんか? ちなみに単語からハッシュ値を求めようとしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

英単語かどうかの大雑把な判別を行えばよいのであれば、fscanfを使えば何とかなります。 fscanf(stream, "%[A-Za-z]", str); といった感じです。(正確にはA-Za-zという表記には移植性がありません。ABCD...Zabcd...zのように全ての文字を並べる必要があります) 厳密に判別したいのであれば、正規表現ライブラリを使うなどする必要があるでしょう。 特に、改行時のハイフネーションや、シングルクオーテーションとアポストロフィの区別など、いろいろ厄介かと思います。さらには、$、&、数字なども英単語といえばいえなくもないので、それらの判別も必要です。

tonna
質問者

お礼

ありがとうございました。 無事解決出来ました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

#include <stdio.h> #include <stdlib.h> #include <ctype.h> char * getword (void) { static char *buf = NULL; static size_t size = 0; char c; int n; if (size == 0) { if ((buf = malloc (size = 8)) == NULL) { return (NULL); } } n = 0; while ((c = getchar ()) != EOF && isspace (c)); if (c == EOF) { return (NULL); } else { buf[n++] = c; } while ((c = getchar ()) != EOF) { if (isspace (c)) { buf[n++] = 0; return ((char *) buf); } else { if (n >= size) { if ((buf = realloc ((void *) buf, size *= 2)) == NULL) { return (NULL); } } buf[n++] = c; } } return (NULL); } int main (void) { char *p; int i; i = 0; while ((p = getword ()) != NULL) { printf ("word%d:%s\n", ++i, p); } return (0); }

tonna
質問者

お礼

ソースまで書いていただき、ありがとうございました。

すると、全ての回答が全文表示されます。
回答No.2

充分なサイズの char buff[64]; とかに対して、 fscanf(inf, "%s", buff); でいけた気がします(未確認) C++の範囲なら、 fstream を開いて、 ifstrema inf("filename"); に対して、 inf >> buff; もいけます。 ただし、ファイルの中に余計なものがなければ。

tonna
質問者

お礼

ありがとうございました。 C++についても勉強になりました。

すると、全ての回答が全文表示されます。
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 C言語の標準ライブラリには、テキストファイルから何らかの区切りを利用して一部分を取ってくるようなものは無かったような気がする。自作するっきゃないな。  ところで、標準ライブラリにはstrtokという関数がある。これを使うと、一連の流れは、 ・バッファを確保する。 ・バッファにデータがあればstrtokで単語を読み取る。 ・バッファにデータが無ければfgetsで1行読み込む。ファイルの最後まで行けば終わり。 というのをルーチン化しておく事で対応できそうだ。

tonna
質問者

お礼

ありがとうございます。 初心者なので難しいですが、勉強になりました。

すると、全ての回答が全文表示されます。

関連するQ&A