アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。ファイルにあるテキストデータを用意してそれを読み込んでいって、処理をするというプログラム書いてるんですけど、たとえば
大まかな構造として、

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文が実行されません。一回目でファイルのデータを最後まで読んでるので、元にもどってもう一回やってくれないんでしょうか?初心者なものでそこらへんがよくわかんないんですが・・。どなたか助けてください。

A 回答 (3件)

掲載したプログラムをちゃんと読んでないのですが(すいません)、fseekでファイルポインタをファイルの先頭まで持っていけば大丈夫でしょう。


#ファイルポインタとは、fopenしたときにファイルの銭湯を指しており、fread等で読み進めると次に読み込む位置を常にさしているものです。

この回答への補足

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

補足日時:2002/01/17 15:55
    • good
    • 0

プログラムを(今度はちゃんと)見てみました。


・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 文中でファイルの最初からもう一度読みたい場合に有効です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/17 18:52

先頭まで戻すだけで良ければ、rewind() って関数の方がお手軽かも。


rewind(fin); と使います。

やっていることは、fseek() のある特別なとき、fseek(fin, 0L, SEEK_SET); と
やるのと全く同じです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/01/17 18:49

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