• 締切済み

fscanf

fscanfを使って、ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたいと思っているのですが、どうすれば良いのかわかりません。 int main(int argc,char *argv[]){ FILE *fp; char *word; fp = fopen(argv[1], "r"); if(fp == NULL){ printf("error: not open file.\n"); return(0) ;} while( ){ fscanf(fp,"%[a-zA-Z]",word); printf("%s\n", word); fflush(stdout); } fclose(fp); return 0; } とりあえず上の様なプログラムで、一単語ずつ順番に単語を出力できるようにしたいと思っているのですが。 いろいろ変なところなど在ると思いますが、whileの条件など、どうすればよいか教えてください。

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

>whileの条件など、どうすればよいか教えてください。  fscanf() が読み込み(代入)に成功した項目数(変換指定子に対応する実引数の個数、今回は word[] の1個)を返しますので、それを while の条件にすれば、と思います。   http://www.bohyoh.com/CandCPP/C/Library/fscanf.html  下のプログラムでは、英単語のデリミタとして「英文字以外」としています。   ですから Let's は、Let と s になります。  なお、2バイト系文字があると・・マズイです(BorlandC++5.6.4)。 ----------------------------------------- #include <stdio.h> int main( int argc, char *argv[] ) {  FILE *fp;  char word[32]; // いままでの経験では18文字が最長  fp = fopen( argv[1], "r" );  if( fp == NULL ){ printf( "error: not open file.\n" ); return( 0 ); }  while( 1 == fscanf( fp, "%[A-Za-z]%*[^A-Za-z]", word ) ){   printf( "%s\n", word );  }  fclose( fp );  return( 0 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。

参考URL:
http://okwave.jp/qa4090414.html
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

#3の者です。#2さんと内容がかぶってしまい、失礼いたしました。 今回の場合、そもそもfscanf()を使わねばならない訳はどのあたりにありますか? fgets()で1行分を読み取り、(多少くせはありますが)strtok()あたりで単語を切り出す、 というようなやり方がわかりやすそうな気がします。私だけかもしれませんが…。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> char *word; 実行時にプログラムが落ちてしまうのではないかと心配です。 適切な要素数を持つ配列の方がよいのではないでしょうか。 > fp = fopen(argv[1], "r"); argcの値を検査せずにいきなりargv[1]にアクセスするのは 危険であるような気がします。 if (argc >= 2) のような検査が必要であるように思います。 > fflush(stdout); これは、いらないのではないかと思います。

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

whileの条件は、「ファイル終端まで処理を繰り返す」としたいですね。 fscanfは、ファイル終端かエラーのときにEOFを返しますので、  while(fscanf(fp,"%s",word)!=EOF) { 処理 } みたいにすればどうでしょう。 変なとこ・・・ ・wordはメモリを確保しないといけない ・fscanfの第2引数がヘン ・fflushは不要?

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

がると申します。 んと…多くの場合、「ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたい」という要求であれば、fgetcのほうがより適切であるように思うのですが。 なにがしか、fscanfでなければならない理由がありますでしょうか?

すると、全ての回答が全文表示されます。
このQ&Aのポイント
  • 大学院進学を考える場合でも、就活をするべきか、それとも大学院進学に集中すべきか悩むことがあります。どちらが良い選択なのか、考えてみましょう。
  • 大学院進学を希望している場合、就活も重要なポイントとなります。就活を通じて社会経験を積み、自己PRを高めることは将来のキャリアにも繋がります。
  • 一方で、大学院進学に必要な勉強や準備に時間を費やすことも重要です。大学院入試対策や研究の深化を図るためには、集中して取り組むことが求められます。どちらを重視するかは、自分の進路や目標によって異なるでしょう。
回答を見る

専門家に質問してみよう