当我从C++中的文件中检索数据时重复数据
Duplicate Data when I retrieve the data from file in C++
首先,我的文件中有一个数据...
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
它是否立即超出范围。
相关文章:
- 如何在Qt中从数据库中检索二进制数据?
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 打印从SQLite3数据库检索的数据C++与命令行中相同的方式
- 通过 host() 从 af::array 检索数据会导致错误的数据
- Winsock 数据不是从 IP 检索的,而是从普通 URL 检索的
- 在数据检索中使用矢量值
- 无法从 SQL Server 检索数据
- sd_journal_send发送二进制数据.如何使用日志检索数据?
- 无法在可视C++中检索资源文件数据
- 在 c++ 中使用指向对象的指针检索数据
- Getter 函数,用于在 2d 数组是类的数据成员时检索 2d 数组元素
- 从新实例的向量中检索数据返回 0
- 如何通过串行终端检索数据而不破坏其在 GNU ARM 嵌入式中的基本值?
- QNETWORK停止连接并检索数据
- 将 JSON 对象作为参数在 JNI 中传递给 CPP,并在 CPP 中检索 JSON 对象的数据
- 相机校准数据检索
- boost asio async_receive_from()在连续发送帧时缺少udp帧数据检索
- 数据检索和索引
- 结构"node"的迭代器不允许数据检索
- Matlab引擎数据检索失败