C++相談室 Part4
■ このスレッドは過去ログ倉庫に格納されています
0154名無しさん@お腹いっぱい。
NGNGifstreamを用いて,同じファイルから2回データを読み込みたいとき,
例えば1回読み込んだあと,
seekgを用いてカレントポジションを先頭に戻し,再び読み込む,即ち
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
char tmp;
ifstream ifs ("hoge.txt");
// 1回目読み込み
while (!ifs.eof ()) {
ifs.get(tmp);
cout << tmp; // 例えば,表示.
}
ifs.seekg (0, ios::beg); // 開始点にシーク
ifs.clear (); // フラグを初期化
// 2回目読み込み
while (!ifs.eof ()) {
ifs.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
のように書けますよね.
同様に,標準入力(catとパイプでつなぎたい)から2回データを読みたいと思いまして,
#include <iostream>
using namespace std;
int main ()
{
char tmp;
// 1回目読み込み
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
cin.seekg (0, ios::beg); // 開始点にシーク
cin.clear (); // フラグを初期化
// 2回目読み込み
while (!cin.eof ()) {
cin.get(tmp);
cout << tmp; // 例えば,表示.
}
return 0;
}
としたところ,うまくいきません.
で,cin.tellg ()を使いましてseekg (0, ios::beg)でカレントがどこに移ったか調べましたところ,
どうやらifstreamの場合と挙動が違うことが分かりました.
つまり,ifstreamではseekg (0, ios::beg)によりカレントポジションが最初の位置に戻りますが,
istream (この場合cin)では戻らないようです.
これは,こういう仕様なのでしょうか? それとも,使用しているライブラリの不備なのでしょうか?
(派生関係にあるのだから,同じように動いて欲しいものです.) 私が使用している環境は,
$ g++ -v
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
です.
■ このスレッドは過去ログ倉庫に格納されています