我用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)
答案 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));