繁体   English   中英

导入csv时出现分段错误11错误

[英]segmentation fault 11 error while importing csv

我正在做一个函数importcsv(),它接受一个文件名并输出一个2D数组。 出于某种原因,每当我使用以下版本的importcsv()时,编译器都会平稳运行,但是可执行文件始终会返回“分段错误:11”错误。

typedef vector<vector<double> > matrix;

matrix importcsv(string filename)
{
   ifstream myfile (filename);  //Constructs a stream, and then asssociates the stream with the file "filename"

   matrix contents; // Vector which will store the contents of the stream.
   int i, j;
   while(!myfile.eof())
   {
       if(myfile.get()==','){++j;}
       else if(myfile.get()=='\n'){++i; j=0;}
       else{
        contents[i][j]=2;}
   }
   return contents;
}

谁能找到错误的根源? 顺便说一句,我有以下标题:

#include <fstream>
#include <iostream>
#include <array>
#include <vector>
using namespace std;

由于没有为contents分配内存,因此出现“ segmentation fault:11”。 仅当contents包含contents[i][j]才有效。

您可以将读取文件和将矩阵构造为多个部分:

  1. 读取一行中的所有数字并将其视为一行contents
  2. 从该行读取一个数字并将其视为一行的一列。

这样,可以简化程序。 这也可以帮助您轻松地找出问题并加以解决。

typedef vector<vector<double> > matrix;

double readNextNumber(std::istream& str)
{
   double n = 0.0;
   str >> n;

   // Skip until we get ',' or '\n'
   while (str)
   {
     int c = str.getc();
     if ( c == ',' || c == '\n' || c == EOF )
        break;
   }
   return n;
}

std::vector<double> importRow(std::ifstram& myfile)
{
   std::string line;
   std::vector<double> row;

   // Read a line as a string.
   // Then parse the string using std::istringstream.
   // When you have finished parsing the line, you know
   // you have finished constructing a row of the matrix.
   std::getline(myfile, line);
   if ( myfile )
   {
      std::istringstream str(line);
      while (str)
      {
         double n = readNextNumber(str);
         if (str)
         {
            row.push_back(n);
         }
      }
   }
   return row;
}

matrix importcsv(string filename)
{
   ifstream myfile (filename);  //Constructs a stream, and then asssociates the stream with the file "filename"

   matrix contents; // Vector which will store the contents of the stream.
   while(!myfile.eof())
   {
       std::vector<double> row = importRow(myfile);
       if (myfile)
       {
          contents.push_back(row);
       }
   }
   return contents;
}

您尚未定义contents的大小。 因此,默认情况下,它将是0元素的vector 因此,对operator[]的调用将导致分段错误。

在这里实施其他人的建议时,快速解决方案是在将每个值读入数组之前使用resize():

//WARNING: THIS PROGRAM UTILIZES C++11
#include <fstream>
#include <iostream>
#include <array>
#include <vector>
#include <cctype>
#include <thread>
using namespace std;
typedef vector<vector<double> > matrix;

matrix importcsv(string filename)
{
    ifstream myfile ("wavelengthtorgb.csv");  //Constructs a stream, and then asssociates the stream with the file "filename".
    matrix contents {{0.0}};
        char nextchar; double data; int i,j;

    while(!myfile.eof())
    {
    myfile.get(nextchar);
        if(nextchar==',')
        {
            ++j; 
            contents[i].resize(j+1); 
            cout<<"encountered a comma."<<" contents is now " <<i+1<<" x "<<j+1<<'\n';
        }
        else if(isspace(nextchar))
        {
            myfile.get(); //You might not need this line - first run with this line, and if there is an error, delete it, and try again.
            ++i; 
            contents.resize(i+1);
            j=0; 
            contents[i].resize(j+1);
            cout<<"encountered a carriage return."<<" contents is now " <<i+1<<" x "<<j+1<<'\n';
        }
        else
        {
            myfile.unget();
            myfile >> data;
            contents[i][j]=data;
            cout<< "encountered a double."<<" contents("<<i<<','<<j<<")="<<data<<'\n';
        }
    }
    return contents;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM