我正在为我班级的一个项目工作。除了一部分,我已经完成了整个工作。我正在从文件中读取整数并将它们转换为bankQueue和eventList。我必须一次做这一行。
我的文件看起来像这样。
1 5
2 5
4 5
20 5
22 5
24 5
26 5
28 5
30 5
88 3
// Get the first arrival event from the input file, and place it in eventList
tempArrivalEvent.type = ARRIVAL;
inFile >> tempArrivalEvent.beginTime >> tempArrivalEvent.transactionLength;
eventList.insert(tempArrivalEvent);
这是我的第一个代码,用于将第一行数据存储到2个变量中。我遇到的问题是我稍后再添加下一行。以下代码与上面的代码功能不同。
if (!inFile.eof())
{
tempArrivalEvent.type = ARRIVAL;
inFile >> tempArrivalEvent.beginTime >> tempArrivalEvent.transactionLength;
anEventList.insert(tempArrivalEvent);
} // end if
第二个代码最终采用与第一个相同的精确数据行。我需要它跳到下一行,但我无法弄明白。这是阻止我的项目工作的唯一因素。
答案 0 :(得分:1)
首先,您完全忽略了两个格式化输入的实际读取提取的潜在失败。仅通过检查作为提取结果的istream的状态来验证是非常容易的。你的第一个案子就变成了:
tempArrivalEvent.type = ARRIVAL;
if (inFile >> tempArrivalEvent.beginTime >> tempArrivalEvent.transactionLength)
eventList.insert(tempArrivalEvent);
其次,可能与您提供的代码更相关,请考虑这一点。在您到达那里之前尝试阅读超越 EOF之前,inFile.eof()
将不会出现true
(假设在此之前所有事情都已成功)。因此,此代码也不正确:
if (!inFile.eof()) // nope, not set yet
{
tempArrivalEvent.type = ARRIVAL;
// both of these fail since we're at EOF, which will now be reported
// as such after the first failure. We, however, never check the stream
// status, and thus blindly insert whatever junk happened to be in the
// tempArrivalEvent object, likely data from a prior insert.
inFile >> tempArrivalEvent.beginTime >> tempArrivalEvent.transactionLength;
// insert unvalidated data
anEventList.insert(tempArrivalEvent);
} // end if
这应该是...... 与初始读取完全相同。验证提取成功,然后执行事件列表插入。
tempArrivalEvent.type = ARRIVAL;
if (inFile >> tempArrivalEvent.beginTime >> tempArrivalEvent.transactionLength)
anEventList.insert(tempArrivalEvent);
注意:所有这一切都假设inFile
是两个提取代码切片中的相同的 ifstream
对象。您还没有澄清是否'将第一个案例inFile
by-reference传递给另一个函数中的第二个案例。如果希望连续读取正常工作,则需要通过引用传递它(或者,使用颤抖,使用全局)。