0

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

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

4

1 回答 1

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

这应该是......与最初的 read 完全相同。验证提取成功,然后才执行事件列表插入。

tempArrivalEvent.type = ARRIVAL;
if (inFile >> tempArrivalEvent.beginTime >> tempArrivalEvent.transactionLength)
    anEventList.insert(tempArrivalEvent);

注意:所有这些都假设在两个提取代码片段中都是inFile一个对象。 ifstream您还没有澄清是否inFile在不同的函数中将第一种情况通过引用传递给第二种情况。如果您希望连续读取正常工作,您需要通过引用传递它(或者,颤抖,使用全局)。

于 2013-04-02T06:01:47.457 回答