当我从C++中的文件中检索数据时重复数据

Duplicate Data when I retrieve the data from file in C++

本文关键字:数据 检索 C++ 文件      更新时间:2023-10-16

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

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|

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

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();
}

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

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

if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << endl;
    }
    myfile.close();
}

流中读取,您始终需要检查流是否处于良好状态!如果读取数据失败,例如,由于到达流的末尾,流将处于失败状态。例如

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

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

这不是读取基于行的输入的方法。 首先,基于行的输入应逐行读取:

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

方法可以解析该行。 最常见的一种解决方案是将其放入std::istringstream并阅读从此。 对于你正在做的事情来说,这可能是矫枉过正,然而;您可能需要类似boost::split的东西(这如果您不能使用 Boost,您可以在不到一个小时的时间内敲门)。

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

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