代码中的分段错误
Posted
技术标签:
【中文标题】代码中的分段错误【英文标题】:segmentation fault in code 【发布时间】:2012-11-21 11:31:27 【问题描述】:我是 C++ 的新手,我想做的是从 .csv 文件中读取并将其存储在向量中然后显示,我的问题是代码在最后一个 reqd 条目后崩溃是从终端运行时从文件中显示,但在 ide (codeblocks) 中,当我尝试调试它时显示 sigsegv 错误...
ps:我想要将文件读入向量的原因是以后能够进入mysqldb
#include <vector>
#include <string>
#include <sstream>
#include<fstream>
#include <iostream>
using namespace std;
vector<string> split_at_commas(const string& row)
vector<string> res;
istringstream buf(row);
string s;
while (getline(buf, s, ','))
res.push_back(s);
return res;
int main()
string line;
ifstream data("Book1.csv" ,ios::out);
while(!data.eof())
getline(data,line,'\n');
vector<string> v = split_at_commas(line);
/*ide points error to this line*/
cout << v[0] << '\t' << v[1] <<'\t' << v[2]<< '\t'<<endl;
data.close();
【问题讨论】:
你的代码缩进很糟糕,你应该感到很糟糕。请修复 你能发布你的数据文件吗?你可能有一行没有三列,所以你试图访问一个不存在的元素。 很可能,您的最后一条记录的值少于 3 个,这使得v[2]
违反了数组的边界。
很难说,也许您在错误的索引处访问 v(超出范围)。你为什么不先检查 v 的大小......
【参考方案1】:
不保证 'v' 包含三个或更多元素。在调用 split_at_commas 之后和在调试器中打印之前检查 'v' 的内容,以验证 v 是否包含 3 个或更多项。
【讨论】:
或者更好的是,使用迭代器遍历每个条目。这样,您将只打印尽可能多的实际条目。 很棒的通用方法,在这里绝对是一个不错的选择。我假设他的输入文件每行总是三个单词,所以如果 v 中有任何内容,它将是三个元素。对于其他场景,您的建议会更好。 @fayyazkl 非常感谢,我只是将输出放在一个循环中,它可以工作,循环如下for(unsigned int i=0;i<v.size();i++)
以上是关于代码中的分段错误的主要内容,如果未能解决你的问题,请参考以下文章