ページ 1 / 1
rewind()の使い方について
Posted: 2016年10月23日(日) 00:53
by akasan
rewind()の使い方がいまいちわかりません。参考書によるとrewind(stdin)と書かれているのですが、ファイルの先頭に戻るとはどういうことでしょうか?・・・
簡単なコードで説明してもらえると分りやすいのですが、いかがでしょうか?
余談ですがここに分りやすくcodeを張り付ける方法がよくわかりません。教えてもらえるとありがたいです。codeと/codeで囲むとはどういうことでしょうか?・・・
Re: rewind()の使い方について
Posted: 2016年10月23日(日) 01:47
by box
akasan さんが書きました:rewind()の使い方がいまいちわかりません。参考書によるとrewind(stdin)と書かれているのですが、ファイルの先頭に戻るとはどういうことでしょうか?・・・
推測ですけど、その昔、磁気テープ(古っ!)を使ってデータの読み書きをしていた時代がありました。
汎用コンピューターでは今も現役なのかな。
さておき、rewindというのは「磁気テープを巻き戻して」先頭に戻るところから来ているようです。
カセットデッキ(これも古っ)にセットしたカセットテープを、巻き戻しボタンで先頭に戻すことをイメージしてみるとよいかもしれません。
rewind(stdin)は、標準入力から読んだ内容をいったんチャラにして、初めから読み直す、くらいの感じでしょうか。
akasan さんが書きました:
余談ですがここに分りやすくcodeを張り付ける方法がよくわかりません。教えてもらえるとありがたいです。codeと/codeで囲むとはどういうことでしょうか?・・・
ここを見てもわかりませんか?
http://dixq.net/board/board.html#k10
Re: rewind()の使い方について
Posted: 2016年10月23日(日) 02:30
by akasan
なんとなくイメージがつきました。rewind(stdin);がきたところで、標準入力から読んだ内容をチャラにするということですね。後はいろいろ試してみてイメージをよりつかんでいくことにします。ありがとうございました。
実験としてコードを入力します。
コード:
#include<stdio.h>
int main(void){
int i;
for(i=1;i<=100;i++){
if(i%3==0&&i%5==0)
printf("FizzBuzz\n");
else if(i%3==0)
printf("Fizz ");
else if(i%5==0)
printf("Buzz ");
else
printf("%2d ",i);
}
}
Re: rewind()の使い方について
Posted: 2016年10月24日(月) 09:19
by YuO
akasan さんが書きました:rewind(stdin);がきたところで、標準入力から読んだ内容をチャラにするということですね。
まず,rewind(stream)と(void)fseek(stream, 0L, SEEK_SET)は,エラーなどの処理を除き,同等の効果です。
そして,標準入出力に対してrewind/fseekできるのかどうかは,仕様書上の定義がありません。
rewind(stdin);について,仕様書通りに捉えるのであれば,標準入力ストリームの先頭にファイル位置表示子を移動させるだけなので,以降は今までの入力を再度読み込む,となります。
fseek(stdin, 0, SEEK_SET)は失敗し,rewindはその結果が受け取れないだけ,という可能性も十分にありえます。
なので,rewind(stdin)はそもそも使わないことをお薦めします。
# 自分で開いたストリームだけをrewind/fseekに渡す。