ページ 11

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に渡す。