2012-10-08 158 views
0

所以一个特异性行,我发现,我想读取文件的具体线路,但我已经有了不工作:阅读从C++中的txt文件

string str; 
int target = 0; 
ifstream record; 

record.open("Record.txt"); 
target = std::count(std::istreambuf_iterator<char>(record), std::istreambuf_iterator<char>(), '\n') - 8; 
cout << target << endl; 

for(int lineNum = 0; lineNum <= target; lineNum++) 
{ 
    getline(record, str); 
    if(lineNum == target) 
    { 
     cout <<"the id: "<< str << endl; 
    } 
} 

在上面,我使用std :: count来计算文件的行数。我知道我总是希望从底部读取第七行,所以我将目标设定为该目标。接下来,我遍历每一行直到目标时间,然后检查我是否在目标行。如果是这样,那么就行了。

但是,它没有给我任何东西。对于具有22行的文件,我得到以下输出:

14 
the id: 

有人可以指出我做错了什么或给我一些提示吗?谢谢!

+0

如果您正在阅读的文件末尾有空行,该怎么办? – nakiya

+0

即使在更正了代码遍历文件两次的代码之后。这是非常缓慢和不必要的。只需要有最后八个读取行的缓冲区,并且一旦您点击EOF,就只保留缓冲区的第一行。 –

+0

我创建文件的方式,它永远不会:) – SantasNotReal

回答

3

std::count()呼叫,但代码之后record流将eof()从未检查std::getline()返回值,以便不知道它是失败的:经常检查读取操作的返回值。这意味着str永远不会被填充,因此"thid id: "消息后没有任何内容被打印。

您需要重置流或重新打开它。

+0

史诗!不能相信我忘了重置流。谢谢一堆! – SantasNotReal

+0

@SantasNotReal,如果你不想重新读取这个文件,你总是可以使用一个大小为8的“队列”。你可以使用的逻辑是保持将行推入一个“队列”,直到大小小于8,否则弹出并推送。读完文件一次后,您的目标线位于顶部。 – Vikas

+0

@Vikas对于这个项目,我暂时不担心效率问题,而不是进行工作迭代。我知道文件大小总是“相对”很小,但这对于提高效率来说是一个好主意。我肯定会为下一次迭代做这件事。 – SantasNotReal