从文件分段故障读取字符串(核心转储)

时间:2012-10-22 19:45:53

标签: c++ string constructor stream

class BPP
{
    unsigned            n;                  /* nº de instancias */
    vector<string>      nombre_instancia;   /* nombre de la instancia*/

在构造函数中,我在以下情况下得到了分段错误(核心转储):

file1.open(fich1);
    if (file1.is_open()){
        file1 >> (unsigned &) n;
        for (unsigned k = 0 ; k < n ; ++k){
            getline(file1, nombre_instancia[k]); #gives the segmentation fault

fich1中的第2行是:

10
 P_0

3 个答案:

答案 0 :(得分:2)

您需要在通过vector::operator[]访问元素之前填充元素。在以下代码中,向量为空:

for (unsigned k = 0 ; k < n ; ++k){
    getline(file1, nombre_instancia[k]);

因此对nombre_instancia[k]的调用超出范围。您可以使用vector::resize()创建元素:

if (file >> n) // Ensure 'n' correctly assigned.
{
    nombre_instancia.resize(n);
    for (unsigned k = 0 ; k < n ; ++k){
        getline(file1, nombre_instancia[k]);
}

另一种方法是使用vector::push_back(),而无需预先了解元素的数量。

答案 1 :(得分:2)

我猜你没有将nombre_instancia的大小调整到超过原来的0大小。试试这个:

  file1 >>  n;
  nombre_instancia.resize(n);     
    for (unsigned k = 0 ; k < n ; ++k){
        getline(file1, nombre_instancia[k]); #gives the segmentation fault

答案 2 :(得分:0)

如果您想使用getline,我认为您需要在向量中保留空间。通过给出nombre_instancia [k],该程序具有未初始化的向量。使用reserve或push_back(null)