c++ - vector push_back 崩溃

标签 c++ stl

我有以下结构。

#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/

相关文章:

c++ - 如何在使用 Windows API 下载文件时创建进度条?

c++ - 如何将 STL 容器作为参数传递给 BOOST_CHECK_EQUAL?

android - 如何使用自定义 Makefile 为 Android 编译 STL C++?

c++ - 使用 libxmlsec1 验证 XML 签名

c++ - CRTP 的模糊过载

c++ - 如何在 QTableWidget 中获取多个选定行的索引

使用 STL 算法与容器(char * 除外)进行 C++ 二进制文件 I/O

c++ - 在 C++ 中使用集合与使用数组

STL - AVX2 相当于 std::clamp

c++ - 我可以在 C++11 中使用具有值语义的多态容器吗?