ここでは、ファイルストリームの位置を自由に変えてみましょう。


ifstream is("test.txt");


//開始位置に戻します
is.seekg(0, ios_base::beg);


//tellg()はファイルのカレント位置を返します
ifstream::pos_type beg = is.tellg();


//ファイルの最後の位置に移動します
is.seekg(0, ios_base::end);
ifstream::pos_type end = is.tellg();


//開始位置に戻します
is.seekg(0, ios_base::beg);


たいてい、この程度使用できれば何とかなります !


<seekg>

まず、seekg()は、指定の位置から指定のサイズだけ位置を移動するという関数です。


is.seekg(0, ios_base::beg);

の、ios_base::begは、開始位置を表します。

つまり開始位置から0バイト移動した位置に移動するということです。


ちなみに第二引数に指定できるのは以下のものです。

ios_base::beg ・・・開始位置

ios_base::cur ・・・カレント(現在)の位置

ios_base::end ・・・終了位置



<tellg>

これは、現在位置を調べる関数です。

返却値の型は、ifstream::pos_typeです。

実はこの型はtypedefでintなどを再定義しています。

それだったら、返却値自体をintにすればいいのに!と思うかもしれません。

intで受け取ってもいいのですが、templateなどで使用するときにこのちょっとしたマジックが

大変役に立つのです!



【補足】

自分の経験ですが、位置を移動するには、ios_base::begを使うのが速いようです。

普通で考えると、ios_base::curから移動する方が移動距離が少なくなるので速くなりそうなのですが。。


なので、もし何回も位置を移動するようなプログラムの場合、どれを使用すると速いかを調べて置いた方が

良いかと思います(^^)




参考:

・ファイルのサイズを取得するには?

・ファイルの内容をstringに入れるには?