-1

首先,我的文件中有一个数据......

1|Malaysia|UK|One-Way|20|6|20|6|2000|12|12|12|12|12|

以上数据是我文件里面的数据

但是当我计算数据时,有一个重复的数据......

1|Malaysia|UK|One-Way|20|6|20|6|2000|12|12|12|12|12|
1|Malaysia|UK|One-Way|20|6|20|6|2000|12|12|12|12|12|

那么当我cout数据时有什么问题???这是代码....

void Flight::displayFlight(vector <Flight> &flightProfile)
{
string readFlightID, readPrice, readBusinessList, readBusinessWaitingList, readEconomicList,            readEconomicWaitingList;
flightProfile.erase(flightProfile.begin(),flightProfile.end());
ifstream inFlight("Flight.txt");
if(inFlight.fail()) return;
while(!(inFlight.eof()))
{
    getline(inFlight,readFlightID,'|');
    istringstream(readFlightID)>>flightID;
    getline(inFlight,departure,'|');
    getline(inFlight,destination,'|');
    getline(inFlight,flightType,'|');
    getline(inFlight,readBusinessList,'|');
    istringstream(readBusinessList)>>businessList;
    getline(inFlight,readBusinessWaitingList,'|');
    istringstream(readBusinessWaitingList)>>businessWaitingList;
    getline(inFlight,readEconomicList,'|');
    istringstream(readEconomicList)>>economicList;
    getline(inFlight,readEconomicWaitingList,'|');
    istringstream(readEconomicWaitingList)>>economicWaitingList;
    getline(inFlight,readPrice,'|');
    istringstream(readPrice)>>price;
    getline(inFlight, day,'|');
    getline(inFlight, month,'|');
    getline(inFlight, year,'|');
    getline(inFlight, hour,'|');
    getline(inFlight, min,'|');
    inFlight.ignore(numeric_limits<streamsize>::max(), '\n');
    cout<<flightID<<departure<<destination<<flightType<<businessList<<businessWaitingList<<economicList<<economicWaitingList<<price<<day<<month<<year<<hour<<min<<endl;
}
inFlight.close();
}
4

3 回答 3

1

从流中读取后,您总是需要检查流是否处于良好状态!如果读取数据失败,例如,因为到达流的末尾,则流将处于失败状态。例如

while (std::getline(inFlight, readFlightID)
       && std::istringstream(readFlightId) >> flightID
       && std::getline(inFlight, departure)
       ...
       ) {
    // now process the read data
}

顺便说一句,请注意,使用临时流的技巧只有在目标类型是std::istream. 如果不是,您需要从流中额外引用,例如使用

std::istringstream("some text") >> std::skipws >> value
于 2013-09-20T17:59:21.520 回答
1

您(和其他人)的常见错误是 eof-bit 仅在输入操作(RTFM)上设置。

逐行读取文件的正确方法是:

if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << endl;
    }
    myfile.close();
}
于 2013-09-20T17:59:23.270 回答
1

那是因为你没有检查你是否getline成功。最后一次通过循环,它可能会失败(因为您已经读取了所有数据),所以您选择了旧值。

不是读取基于行的输入的方法。对于初学者,应逐行读取基于行的输入:

std::string line;
while ( std::getline( inFlight, line ) ) {
    //  Parse line here...
}

有很多方法可以解析行。最常见的解决方案之一是将其放入std::istringstream并从中读取。但是,这对于您正在做的事情可能有点矫枉过正。你可能需要类似的东西boost::split(如果你不能使用 Boost,你可以在不到一个小时的时间内完成)。

无论如何,while ( !someIStream.eof() )永远是不正确的。

另外两个快速评论:您不应该在需要变量之前定义它们, inFlight如果它立即超出范围,则关闭没有真正意义。

于 2013-09-20T18:01:58.433 回答