9

ifstream を使用してファイルから行を読み取った後、条件付きで、読み取ったばかりの行の先頭にストリームを戻す方法はありますか?

using namespace std;
//Some code here
ifstream ifs(filename);
string line;
while(ifs >> line)
{
   //Some code here related to the line I just read

   if(someCondition == true)
   {
    //Go back to the beginning of the line just read
   }
   //More code here
} 

したがって、someCondition が true の場合、次の while ループの反復中に読み取られる次の行は、今読んだばかりの行と同じになります。それ以外の場合、次の while ループの反復では、ファイル内の次の行が使用されます。さらに説明が必要な場合は、お気軽にお問い合わせください。前もって感謝します!

更新 #1

だから私は次のことを試しました:

while(ifs >> line)
{
   //Some code here related to the line I just read
   int place = ifs.tellg();
   if(someCondition == true)
   {
    //Go back to the beginning of the line just read
    ifs.seekg(place);
   }
   //More code here
}

ただし、条件が真の場合、同じ行を再度読み取ることはありません。ここで整数は許容可能なタイプですか?

更新 #2: 解決策

私のロジックに誤りがありました。好奇心旺盛な人のために、私が望むように機能する修正版を次に示します。

int place = 0;
while(ifs >> line)
{
   //Some code here related to the line I just read

   if(someCondition == true)
   {
    //Go back to the beginning of the line just read
    ifs.seekg(place);
   }
  place = ifs.tellg();
   //More code here
}

前に読み取った行の先頭にシークする必要があるため、tellg() の呼び出しは末尾に移動されました。初めて tellg() を呼び出してから、ストリームが変更される前に seekg() を呼び出しました。皆様の貢献に感謝いたします。

4

2 に答える 2

6

「最後の行の先頭に戻る」という直接的な方法はありません。ただし、 を使用すると、キープした位置に戻すことができますstd::istream::tellg()。つまり、使用する行を読み取る前に、その位置に戻るために使用tellg()します。seekg()

ただし、シーク関数を頻繁に呼び出すのはかなりコストがかかります。つまり、行を再度読み取る必要をなくすことを検討します。

于 2012-10-15T21:17:56.863 に答える
4

fstream の位置をファイルに保存します (ドキュメントを参照してください)。

読み込まれた行。

条件が発生した場合 - ファイル内の保存された位置に移動します。

あなたはこれを必要とします:

于 2012-10-15T21:16:28.433 に答える