我有以下结构。
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
struct station {
std::string id;
std::string code;
std::string station_name;
station(std::vector<std::string> &in) : id(in[0]), code(in[1]),
station_name(in[2]) {}
station(): id (""), code (""), station_name(""){}
bool operator<( const station& rhs ) const {
return this->station_name < rhs.station_name;
}
};
int main(int argc, char **argv) {
std::ifstream ifs(argv[1]);
if ( ifs.peek() == EOF ) {
exit ( 1 );
}
// Read the input file and update the database
std::string line;
station prev, current;
std::set<station> my_set;
while( ifs.good()&& std::getline(ifs,line) ) {
std::stringstream lineStream(line);
std::string token;
std::vector<std::string> input;
while(std::getline(lineStream,token,',')) {
input.push_back(token);
}
station st(input);
my_set.insert(st);
}
}
我正在读取一个文件,其中包含与 railway stations
相关的信息采用以下格式
ID,Station Code,Station Name
我正在逐行读取此文件并创建 station
的对象然后将其插入 std::set<station>
它会在一段时间后崩溃,大约在阅读 21448
之后线。我有大约403523
线条
这里有什么问题。
这个程序在 Linux 上运行正常,但在 Windows 上运行不正常
我得到 debug assertion failed
最佳答案
采用数组的构造函数让我担心。
编辑
基于更新的问题:
问题是构造函数接受了一个 vector 。
您正在访问元素而不检查它们是否存在。
因此,如果任何一行输入错误(即并非所有值都存在),那么 vector 将不会像所需的那么大并导致未定义的行为。
如果你改变这些行:
while(std::getline(lineStream,token,',')) {
input.push_back(token);
}
进入:
std::getline(linestream, id, ',');
std::getline(linestream, code, ',');
std::getline(linestream, name, ',');
然后使用这些参数调用站构造函数(在 OO 代码中会很好)。那么你就不会看到崩溃。一些错误检查也很好。
注意:
while( ifs.good()&& std::getline(ifs,line) ) {
这里不需要勾选good()。如果流状态不佳,则 getline() 将不执行任何操作。流(getline() 的返回值)到 bool 的转换也在检查状态是否是流是否对进一步读取有效,如果不是则将转换为 false(最终)。
// This is more idiomatic.
while(std::getline(ifs,line) ) {
原创
试试这个:
struct station
{
std::string id;
std::string code;
std::string station_name;
friend std::istream& operator>>(std::istream& stream, station& data)
{
std::string line;
std::getline(stream, line);
std::stringstream linestream(line);
std::getline(linestream, data.id, ',');
std::getline(linestream, data.code, ',');
std::getline(linestream, data.station_name);
return stream;
}
};
int main()
{
std::ifstream file("station.txt");
std::vector<station> stations;
std::copy(std::istream_iterator<station>(file),
std::istream_iterator<station>(),
std::back_inserter(stations)
);
}
关于c++ - vector push_back 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8450098/