我最初建立一个索引类似的机制,阅读的每一行文本文件使用正确的单词,检查其是否符合已知的标题宣言》(string.比较)和节省的tellg位置作为索引到这一点。我的意思是然后用seekg(索引,ios::求)要求的地方,在文件的标题。通过阅读该文件后,当建设我的索引和调seekg(0,ios::求)的下一个正确的单词返回的一个空串我希望看到第一线的文件。

一部分,我的代码如下更好地突出我的问题

//build the index
while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead);
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

// start reading the file data
m_fileIn.seekg(0,ios::beg);
//read first line (title)

该getLineID功能返回int根据结果的串的比较。

是用正确的单词不正确,如果我需要重新阅读该文件?

有帮助吗?

解决方案

你的问题的造成是因为你有一个坏的位置内部流。
操作上的流会以前忽略的不良位已经重置。

// After the loop reset the Bad Bits.
m_fileIn.clear()

注:一个糟糕的位是一个许多错误的条件,包括EOF

但这不是你的主要问题:

你使用 Classic anti pattern 阅读一个文件:
而不是使用这个。

while (getline (m_fileIn,lineRead))
{
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

问题是,EOF是不设置,直到你读过它。
最后一个有效的阅读读最高的,但不是过去的EOF(因此EOF是不设置)。

因此,考虑的情况下,你已经读的最后一行中的文件。EOF尚未设定,因为你没有读过它。所以循环是进入。你现在执行正确的单词().这种试图读取过去的EOF作为绝对没有数据读取(不是一个单一的字节)。所以,正确的单词()失败了现在你打电话getlineID()使用lineRead,其价值是不确定的(标准并不是说会发生什么lineRead当EOF的条件是打;但它可能具有的价值最后一行解读为你似乎并不重置它的内部循环)。

另一个问题与这个代码是它只检查EOF.什么时候会发生另一种类型的错误?循环实际上被困在一个无限的循环;这是因为当一个错误标志设定没有更多的阅读,会发生所以你可以永远不会达到EOF.

while (! m_fileIn.eof())
{
   getline (m_fileIn,lineRead)
   int lineID = getLineID(lineRead);
   if(lineID==1)       //if its an STRM 
   {
   //save the index
   }
}

该方案是执行该读作,同时循环试验。这是因为,正确的单词()返回的流通过了作为第一个参数。因此流中得到使用,在布尔上下文。当一个流用于在布尔方面是转变成一种类型,可用作一个布尔;值此对象是相当真实的,如果没有错误和虚假的。

在这种情况下阅读的尝试,但是如果失败的循环永远不会是进入。

其他提示

后张贴在这里和拖网捕捞各种各样的网站我加入线

m_fileIn.clear();

前线

getline (m_fileIn,lineRead);

通过清除的错误标志(我假设eof错误),我能够继续作为正常的。

马丁我是真的感兴趣找出更多的反模式而我在不知不觉中使用,我已经更新我的代码,以包括更改,非常感谢。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top