逐行读取数据,但不是一次读取数据

时间:2013-04-02 05:43:01

标签: c++

我正在为我班级的一个项目工作。除了一部分,我已经完成了整个工作。我正在从文件中读取整数并将它们转换为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

第二个代码最终采用与第一个相同的精确数据行。我需要它跳到下一行,但我无法弄明白。这是阻止我的项目工作的唯一因素。

1 个答案:

答案 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传递给另一个函数中的第二个案例。如果希望连续读取正常工作,则需要通过引用传递它(或者,使用颤抖,使用全局)。