プロが教える店舗&オフィスのセキュリティ対策術

テキストファイルから英単語を読み取るプログラムを考えています。

fgets()だと一行読み取ってしまい、上手くいきませんでした。

初心者の私ですが、教えていただけませんか?

ちなみに単語からハッシュ値を求めようとしています。

A 回答 (4件)

英単語かどうかの大雑把な判別を行えばよいのであれば、fscanfを使えば何とかなります。



fscanf(stream, "%[A-Za-z]", str);

といった感じです。(正確にはA-Za-zという表記には移植性がありません。ABCD...Zabcd...zのように全ての文字を並べる必要があります)

厳密に判別したいのであれば、正規表現ライブラリを使うなどする必要があるでしょう。
特に、改行時のハイフネーションや、シングルクオーテーションとアポストロフィの区別など、いろいろ厄介かと思います。さらには、$、&、数字なども英単語といえばいえなくもないので、それらの判別も必要です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/18 21:21

#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);
}
    • good
    • 1
この回答へのお礼

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

お礼日時:2005/10/18 21:22

充分なサイズの


char buff[64];
とかに対して、
fscanf(inf, "%s", buff);
でいけた気がします(未確認)

C++の範囲なら、
fstream を開いて、
ifstrema inf("filename");
に対して、
inf >> buff;

もいけます。
ただし、ファイルの中に余計なものがなければ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/18 21:23

 C言語の標準ライブラリには、テキストファイルから何らかの区切りを利用して一部分を取ってくるようなものは無かったような気がする。

自作するっきゃないな。

 ところで、標準ライブラリにはstrtokという関数がある。これを使うと、一連の流れは、

・バッファを確保する。
・バッファにデータがあればstrtokで単語を読み取る。
・バッファにデータが無ければfgetsで1行読み込む。ファイルの最後まで行けば終わり。

というのをルーチン化しておく事で対応できそうだ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/18 21:24

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