- 締切済み
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の条件など、どうすればよいか教えてください。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- yama5140
- ベストアンサー率54% (136/250)
>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 ); } 注:インデントに全角空白を用いています。タブに一括変換して下さい。
- asuncion
- ベストアンサー率33% (2127/6289)
#3の者です。#2さんと内容がかぶってしまい、失礼いたしました。 今回の場合、そもそもfscanf()を使わねばならない訳はどのあたりにありますか? fgets()で1行分を読み取り、(多少くせはありますが)strtok()あたりで単語を切り出す、 というようなやり方がわかりやすそうな気がします。私だけかもしれませんが…。
- asuncion
- ベストアンサー率33% (2127/6289)
> char *word; 実行時にプログラムが落ちてしまうのではないかと心配です。 適切な要素数を持つ配列の方がよいのではないでしょうか。 > fp = fopen(argv[1], "r"); argcの値を検査せずにいきなりargv[1]にアクセスするのは 危険であるような気がします。 if (argc >= 2) のような検査が必要であるように思います。 > fflush(stdout); これは、いらないのではないかと思います。
- JaritenCat
- ベストアンサー率37% (122/322)
whileの条件は、「ファイル終端まで処理を繰り返す」としたいですね。 fscanfは、ファイル終端かエラーのときにEOFを返しますので、 while(fscanf(fp,"%s",word)!=EOF) { 処理 } みたいにすればどうでしょう。 変なとこ・・・ ・wordはメモリを確保しないといけない ・fscanfの第2引数がヘン ・fflushは不要?
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 んと…多くの場合、「ファイル(普通の英文が入っています)から一単語ずつ読み込んでいきたい」という要求であれば、fgetcのほうがより適切であるように思うのですが。 なにがしか、fscanfでなければならない理由がありますでしょうか?