• ベストアンサー

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

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

  • tonna
  • お礼率100% (4/4)

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

  • ベストアンサー
  • 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

  • C言語でアナグラムを求めるプログラム

    C言語初心者で、勉強中です。 今アナグラムを求めるプログラムをC言語で作成しています。 内容はあらかじめある英単語が書いてあるテキストファイルから互いにアナグラムとなっている英単語をすべて求めてそれを出力するというプログラムです。 どこから手をつけていいかわからず悩んでいます。 そこでヒントをいただこうと思って質問しました。 どなたか回答よろしくお願いします。

  • C言語のテキストファイルの読込み

    必要に迫られてC言語でテキストファイルの読込みを行う プログラムを作成しなければならなくなりました。 whileとfscanfを用いて書式を指定して一行ずつ読込むことができる ということは知っていますが、その際、たとえば読み込むファイルが 20行のテキストファイルだったとして、10行目から読込みを 行いたい場合はどのようにプログラムを書けばいいのでしょうか? なにぶんC言語初心者ですのでよろしくお願いします。

  • C言語のプログラムについて質問です。

    C言語初心者で困っています。 テキストデータの上から3行分を飛ばして、4行目から読み込むようにするにはどのようなプログラムを書けば良いでしょうか? ちなみにデータは2列、100003行あります。 よろしくお願いします。

  • C言語のプログラミングについて

    C言語のプログラミングについて プログラミング初心者です。下のプログラムに詰まりました。 下のプログラムをfgets()、atoi()の組とgetchar()を用いて表示するにはどのようなプログラムを書けばよろしいのでしょうか? % ./descending 正の整数: 10 英文字: z 1: z 2: y 3: x 4: w 5: v 6: u 7: t 8: s 9: r 10: q %

  • C言語で、エクセルの中身を読みたい

    C言語で、エクセルやワードの中の文字列を読み込むにはどうしたら良いのでしょうか?テキストファイルからなら1行づつ読めるのですが、エクセルやワードファイルの中身をfgets関数やfread関数を使って読み込もうとしても、文字が化けたものしか取得できません。どのようにしたら良いか教えてください。お願いいたします。

  • C言語のファイル読み込みに関して。

    英文を入力したテキストファイルを読み込むプログラムをつくっているのですが、 ファイル読み込みが上手くできません。 #include<stdio.h> main() { char filename[33]; char sty[512]; FILE *fp; printf("FILENAME: "); fgets(filename, 33, stdin); //読み込むテキストファイルを指定 fp = fopen(filename,"r"); if(fp == NULL){ printf("Can't open the file!\n"); return -1; } fgets(sty, 512, fp); fclose(fp); printf("%s\n",sty); } このプログラムなのですが、どうしても"Can't open the file!"が表示されてしまいます。 どうすればいいのでしょうか?

  • ファイルから文字列(英単語)を比較して数える

    現在perlを勉強中の身です。 1行に1英単語があり、それが100~200行に渡ってあるファイルがあります。 このファイルの単語に重複しているものはありません。Xとします。 また別のファイルにも同様に1行に1英単語があり、それが100~200行に渡ってあるファイルがあります。 このファイルの単語は重複しているものがあります。Yとします。 当然、最初のファイルにある単語もない単語もあります。 ファイルXから単語を読み取りYでその単語が何回出現したかチェックして単語と出現回数を出力するようなプログラムを組みたいと考えています。 参考書やインターネットで調べたところ、単語を数えるプログラム等はあるのですが、ファイルを読み込みさらにファイルを読み込んで比較する、といった流れのプログラムを見つけることができませんでした。 遠回りな考え方だと 例えば ファイルX a b c d(本当は単語間は改行があり1行1単語なのですが、見やすさのためにこのように表記しました。) ファイルY c c d e f とあった場合まず二つのファイルを結合し ファイルZ a b c d c c d e f として二回以上出現した単語のみを抜き出し ファイルZ' c 2 d 1 (この時出現回数を-1回する) としてファイルXと結合して出現回数を足して-1すると ファイルX' a 0 b 0 c 2 d 1 のようにできるのではないかと考えてはいます。しかし遠回り過ぎてスマートではないように感じます。 どのような考え方、そしてどのようなプログラムを組めばよいのでしょうか。ご教授お願い致します。

    • ベストアンサー
    • Perl
  • C言語 複数ファイル操作について

    Cプログラミング初心者です。 論文などの何行も文章があるようなテキストファイル(ここでは1.txtとします)と、他に予め単語をいくつか登録しているテキストファイル(2.txt)を開き、1.txtを最初の行から一行ごとに読み込み、2.txtの中にある単語が1つでもその一行の文章中に含まれていたらその一行の文章を出力し、また次の行においても2.txtの中にある単語のいずれかが含まれているかどうかを調べて含まれている場合は出力…含まれていない場合は出力せずに次の行へ…といったようにこれを1.txt内の最後の行まで繰り返し行うプログラムを作りたいのですが、自分が作ったプログラムでは含む・含まない関係なく1.txt内の文章全てが出力されてしまいます。おそらく最初のwhile文あたりがおかしいのだろうという予想はつくのですがどのように直せばよいのかわからず悩んでいます。どなたか教えていただければ嬉しいです(;_:) #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1056 void delkaigyo(char *s1,char *s2){ char *p = s1; p=strstr(s1,s2); if(p!=NULL){ strcpy(p,p+strlen(s2)); delkaigyo(p+1,s2); } } int main(void){ FILE *fp; char *filename = "2.txt"; char str1[N]; char str2[N]; char kaigyo[] = "\n"; int i; int a=0; char fname[64]; printf("file:"); scanf("%s", fname);   ←ここで1.txtを入力するとします fp = fopen(fname, "r"); while(fgets(str1, N, fp) != NULL){ delkaigyo(str1, kaigyo); memset(str1, 0, N); fread(str1, 1, N-1, fp); if((fp = fopen(filename, "r")) == NULL){ fprintf(stderr, "%serror.\n", filename); exit(EXIT_FAILURE); } while(fgets(str2, N, fp) != NULL){ delkaigyo(str2,kaigyo); if(strstr(str1,str2)!=NULL){ a = 1; printf("%s\n", str1); break; } } if(a==0){ return 0; } fclose(fp); } return EXIT_SUCCESS; }

  • C言語でのカンマ区切りについて

    結果テキストファイルから特定の値のみ抽出するプログラムを作成しているのですが、思うように動いてくれません。どなたか教えてくださいませんか。お願いします。 <テキストファイルの形式> 様々な文字や記号slm,0.070000,-53458.000000様々な文字や記号 これが1行に4つ程含まれるものが10行ほどあるのですが、 2つ目のカンマの後の数値部分のみ抽出したいのです。 <プログラム> char line[MAXLINE]; char a1[]="slm"; char *r; char *s[2]; while (fgets(line, MAXLINE, fp) != NULL){ if(strstr(line, a1)!=NULL){ for (r = line ;r = strstr(r, a1); r += 27 ){ for(int p=0;p>2;p++){ s[p]=strtok( strstr(r, a1), "," ); printf("%s",s[3]); } } printf(" \n"); i++; } } そこでこのようなプログラムを作ってみたのですが、実行すると何も表示されません。 どなたか改善策を教えてください。本当に困っています。

  • C言語でテキストファイルのデータ処理

    はじめまして。 僕はC言語に関して全くの初心者です。 どうぞよろしくお願いします。 例えば、 1,0,0,7,6 2,0,0,5,5 3,1,0,4,9 : : のようなテキストファイル、test.txtがある時、 1行目の4カラム目(7)と5カラム目(6)を、 それぞれの行について差し引くプログラム、 つまり全ての行について4カラム目は7を引き、 5カラム目は6を引くプログラムの事で、 この例では、 1,0,0,0,0 2,0,0,-2,-1  3,1,0,-3,-3 : : となるようなプログラムを書き、結果を出力したいのですが、よく分かりません。 ちなみにawkで書いて実行すると、 (プログラム名はtest.awkとする) BEGIN{ i=0; } { while(i<1){ v3 = $4; v4 = $5; i++; } print $1,$2,$3,($4 - v3),($5 - v4); } 実行するプログラム↓ awk -f test.awk test.txt という感じなのですが…。 これを上述の様に、C言語でプログラムを書いて、 実行するには、例えばどのようなプログラムを書けば いいのでしょうか? なにぶん初心者のため、分からない事だらけですが、 よろしくお願いしますm(__)m

専門家に質問してみよう