2012-10-15 21 views
5

当我使用ifstream从文件中读取一行后,是否有办法让流回到我刚刚读取的行的开头,有条件?如何将ifstream返回到刚刚用C++读取的行的开头?

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(),这就是为什么它没有任何改变(因为它没有改变)。谢谢大家的贡献。

+1

使用tellg()在读取该行之前获取流位置并seekg()将流位置设置为之前保存的位置。 –

+1

顺便说一下,ifs >>到字符串不是获取行,而是字。使用std :: getline –

+0

感谢您关注getline。它可能会在未来造成恼人的错误。 –

回答

3

没有直接的方式来表达 “找回最后一行的开始”。但是,您可以使用std::istream::tellg()回到您保留的位置。也就是说,在阅读一条线之前,您需要使用tellg(),然后使用seekg()返回该位置。

但是,经常调用搜索函数相当昂贵,也就是说,我会考虑删除再次读取行的要求。

+0

谢谢。效率并不是我的直接担忧,但我会尝试稍后研究其他一些方法。现在我的主要焦点是获得一些有用的东西。 –

+0

我需要从函数中的40GB文件中读取字符,直到找到该函数不应读取的字符(分隔字符)。使用peek()更便宜或tellg()seekg()来标记之前的字符位置,我需要返回到?我想最有效率的方法是不使用任何这个,只返回额外的读字符。 – bkarj

+0

@BehroozKarjoo:使用'peek()'相当便宜。本质上它会返回this-> gptr()!= this-> egptr()? * this-> gptr():this-> underflow();'(尽管将char'正确地扩展为'int')。假设流被缓冲,这是一个指针比较和取消引用。一个'peek()'调用可以做更多的工作。 –

相关问题