• ベストアンサー

ファイル中のデータの読むとき・・・・

こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば 大まかな構造として、 int fncCheck(char*pch,char item) { int count=0; int i=0; for(i=0;i<strlen(pch);i++) {if(pch[i]==item) { count++; } } return count; } int main() { FILE *fin,*fout;  //ここでいろいろ宣言 if((fin=fopen("Thermoplasmaacidophilum ","r"))==NULL) { cout<<"No files exist in current directory!\n"; exit(-1); } if((fout=fopen("Thermoplasmaacidophilum _out","wb"))==NULL) { cout<<"Output file can't open!\n"; exit(-1); } if((fin=fopen("Thermoplasmaacidophilum ","r"))!=NULL) { fwrite(SMF_header,14,1,fout); fwrite(SMF_firsttrack,36,1,fout); fwrite(SMF_track,13,1,fout); do {    //ここにdoに関する処理 } while(numread==100); while(c=fscanf(fin,"%c",c)!=EOF) {   //ここに処理をずらずら } printf("There are %d bases!!\n",n); fclose(fin); fclose(fout); } return 0; } ・・・のように書くと、一つ目のdo-while文は実行されるんですが、二つ目のwhile文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

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

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.1

掲載したプログラムをちゃんと読んでないのですが(すいません)、fseekでファイルポインタをファイルの先頭まで持っていけば大丈夫でしょう。 #ファイルポインタとは、fopenしたときにファイルの銭湯を指しており、fread等で読み進めると次に読み込む位置を常にさしているものです。

yabuchanchan
質問者

補足

御回答ありがとうございます。えっと、そのfseek関数?ってのを、2回目のwhileの前に書き足せばOKなんでしょうか? ちょっと、調べてみます。ありがとうございました。

その他の回答 (2)

  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

プログラムを(今度はちゃんと)見てみました。 ・fin で同じファイルを2回オープンしているのは何故でしょうか?一度オープンが成功していれば2度目は必要ありません。また、同じ変数(fin)を使ってオープンすると、最初にオープンしたものがclose出来なくなってしまいます(プログラムが終了すれば自動的にcloseされるので今回はとりあえず問題ありません)。 ・while(c=fscanf(fin,"%c",c)!=EOF)は  while((c=fscanf(fin,"%c",c))!=EOF)と書かないとまずいですね。fscanfの戻り値と EOFの比較結果が c に代入され、その値で whileの条件となります。 >2回目のwhileの前に書き足せばOKなんで しょうか? do ? while で fscanf や fread、fgets、fgetcなどを使って finのファイルポインタが読み進んでいる場合やEOFに達している場合、次のwhile 文中でファイルの最初からもう一度読みたい場合に有効です。

yabuchanchan
質問者

お礼

ちゃんと、見てくださってありがとうございました。 fin=fopenのところ、ご指摘の通りへんですよね? 直します。あと、while((c=fscan(fin,"%c",c))!=NULL)のところも、うっかりしてました。勉強になりました。 ファイル処理にはまだ慣れてないところもあるんで、もっと勉強したいと思います。またわかんないところがあったら、ここで質問たり調べたりして、もっと知識を増やしていきたいです。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

先頭まで戻すだけで良ければ、rewind() って関数の方がお手軽かも。 rewind(fin); と使います。 やっていることは、fseek() のある特別なとき、fseek(fin, 0L, SEEK_SET); と やるのと全く同じです。

yabuchanchan
質問者

お礼

御回答ありがとうございました。 さっそく、やってみたいと思います。 fseek関数については初めて知ったんですが、いろいろ調べているうちに 便利なもんだなとおもいはじめました。 rewindなんてのもあるんですね。もっと勉強したいと思います。

関連するQ&A