尝试访问向量时的分段错误 - cpp

时间:2015-02-02 12:23:55

标签: c++ csv segmentation-fault

我用c ++编写了一些代码。它从CSV文件中读取数据,然后将第二行打印到屏幕上:

vector<string> readCsvFileContent()
{
    vector<string> buffer;

    try {
        ifstream inputFile;
        string line;

        inputFile.open("Input.csv", static_cast<std::ios::openmode>(std::ios::in) );

        while (getline(inputFile,line)) {
            buffer.push_back(line);
        }

       inputFile.close();
    }
    catch (ifstream::failure e) { 
        cout<<"No file read"<<endl;            
        throw e;
    }

    return buffer;
}

此函数调用如下:

cout << "reading from file" << endl;
vector<string> inputData = readCsvFileContent();
cout << inputData.size() << endl;
cout << inputData[1] << endl;

当它在调试中运行时,它会显示它应该显示的内容:

[ 50%] Building CXX object src/CMakeFiles/version1.dir/version1.cc.o
Linking CXX executable version1
[ 50%] Built target version1
[100%] Generating House1.csv
reading from file
322274
"2014-07-01 00:00:06",155,0,0,0,NULL,0,0,0,0,NULL
[100%] Built target process_csv

但是当我运行我的代码时,我得到了:

reading from file
0
Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:4)

你得到一个段错误,因为你读过了矢量边界

inputData.size() // 0 i.e. empty
inputData[1] // undefined behaviour

您的代码应检查文件是否已成功打开。你可以这样做:

if (!inputFile.is_open())
    // throw or whatever

或者,因为你似乎已经为try-catch做好了准备,正如molbdnilo指出的那样,你可以要求流输入失败:

inputFile.exceptions(std::ifstream::failbit);

要测试文件是否为空,只需检查您已打印的inputData.size(),但忽略。

现在,剩下的问题是,为什么它在调试中有效但在发布时却没有?好吧,我的水晶球没电了,但我可以推测你的版本有不同的工作目录,文件丢失或在另一个文件中不可读。您还没有告诉您构建的内容,但这可能是相关的:

  

[100%]生成 House1.csv

     

inputFile.open(&#34; Input.csv &#34;,static_cast(std :: ios :: in));