Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用std::string时出现分段错误 我唱C++来构建一个CSV处理器,用于学习目的,并且有一些分割错误。 此处理器将有一个主类(csvcontroller),该类应为当前文件的实例。这个类控制两个结构。其中一个(CsvLine)是所有文件行的列表,另一个(CsvColumn)表示每个列表上所有列的列表。 我的分段错误发生在我尝试将列值写入结构时,但它只发生在我使用字符串时。如果我们将string替换为int,那么处理器将按照我想要的方式运行_C++_Class_Struct_Segmentation Fault - Fatal编程技术网

使用std::string时出现分段错误 我唱C++来构建一个CSV处理器,用于学习目的,并且有一些分割错误。 此处理器将有一个主类(csvcontroller),该类应为当前文件的实例。这个类控制两个结构。其中一个(CsvLine)是所有文件行的列表,另一个(CsvColumn)表示每个列表上所有列的列表。 我的分段错误发生在我尝试将列值写入结构时,但它只发生在我使用字符串时。如果我们将string替换为int,那么处理器将按照我想要的方式运行

使用std::string时出现分段错误 我唱C++来构建一个CSV处理器,用于学习目的,并且有一些分割错误。 此处理器将有一个主类(csvcontroller),该类应为当前文件的实例。这个类控制两个结构。其中一个(CsvLine)是所有文件行的列表,另一个(CsvColumn)表示每个列表上所有列的列表。 我的分段错误发生在我尝试将列值写入结构时,但它只发生在我使用字符串时。如果我们将string替换为int,那么处理器将按照我想要的方式运行,c++,class,struct,segmentation-fault,C++,Class,Struct,Segmentation Fault,这是我的代码: csvcontroller.h: #ifndef CSVCONTROLLER_H #define CSVCONTROLLER_H #include <iostream> #include <string> using namespace std; typedef struct CsvLine{ struct CsvLine* next = NULL; struct CsvColumn* first = NULL; struc

这是我的代码:

csvcontroller.h:

#ifndef CSVCONTROLLER_H
#define CSVCONTROLLER_H

#include <iostream>
#include <string>
using namespace std;


typedef struct CsvLine{

    struct CsvLine* next = NULL;
    struct CsvColumn* first = NULL;
    struct CsvColumn* last = NULL;
    struct CsvLine* previous = NULL;

};

typedef struct CsvColumn{

    struct CsvColumn* previous = NULL;
    string value = NULL;
    struct CsvColumn* next = NULL;

};


class csvcontroller{
    public:
        bool loadfile(string file_location,char separator);
        bool savefile(string file_location,char separator);
        CsvLine* getFirst();
        CsvLine* getLast();
        CsvLine* addLine();
        void addColumn(CsvLine* line,string* value);
        int getCount();
    protected:
        string path;
        CsvLine* first = NULL;
        CsvLine* last = NULL;
        int line_count;
    private:
};

#endif // CSVCONTROLLER_H
\ifndef CSVCONTROLLER\u H
#定义CSV控制器
#包括
#包括
使用名称空间std;
类型定义结构CsvLine{
struct CsvLine*next=NULL;
struct CsvColumn*first=NULL;
struct CsvColumn*last=NULL;
struct CsvLine*previous=NULL;
};
类型定义结构CSV列{
struct CsvColumn*previous=NULL;
字符串值=NULL;
struct CsvColumn*next=NULL;
};
类CSV控制器{
公众:
bool loadfile(字符串文件\位置,字符分隔符);
bool savefile(字符串文件\位置,字符分隔符);
CsvLine*getFirst();
CsvLine*getLast();
CsvLine*addLine();
void addColumn(CsvLine*行,string*值);
int getCount();
受保护的:
字符串路径;
CsvLine*first=NULL;
CsvLine*last=NULL;
整数行计数;
私人:
};
#endif//CSVCONTROLLER\u H
csvcontroller.cpp

#include "csvcontroller.h"
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <sstream>

using namespace std;

bool csvcontroller::loadfile(string file_location,char separator){

    this->path = file_location;
    const char * path = this->path.c_str();

    //Initializing read stream
    ifstream file;
    file.open(path);

    //Reading our file
    while(!file.eof()){

        string line;
        std::getline(file,line);
        stringstream stream(line);

        if(!line.empty()){

            string col;
            CsvLine* ln = this->addLine();

            while(std::getline(stream,col,separator)){
                this->addColumn(ln,&col);
            }

        }//if(!line.empty

    }//while(!file.eof())



    return false;
}

CsvLine* csvcontroller::addLine(){
    CsvLine* item = (CsvLine*) malloc(sizeof(CsvLine));

    if(this->first == NULL){

        this->first = item;
        this->last = item;

    }else{

        this->last->next = item;
        item->previous = this->last;
        this->last = item;

    }
}

void csvcontroller::addColumn(CsvLine* line,string* value){

    CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
    col->value = value;//Here's the problem

    if(line->first == NULL){

        line->first = col;
        line->last = col;

    }else{

        line->last->next = col;
        col->previous = line->last;
        line->last = col;

    }

}

/*
 *  GET & SET
 */

CsvLine* csvcontroller::getFirst(){
    return this->first;
}

CsvLine* csvcontroller::getLast(){
    return this->last;
}
#包括“csvcontroller.h”
#包括
#包括
#包括
#包括
使用名称空间std;
boolcsvcontroller::loadfile(字符串文件\位置,字符分隔符){
此->路径=文件位置;
const char*path=this->path.c_str();
//初始化读取流
ifstream文件;
打开(路径);
//阅读我们的文件
而(!file.eof()){
弦线;
std::getline(文件,行);
弦流(线);
如果(!line.empty()){
字符串列;
CsvLine*ln=this->addLine();
while(std::getline(流、列、分隔符)){
此->添加列(项次,&col);
}
}//如果(!line.empty)
}//而(!file.eof())
返回false;
}
CsvLine*csvcontroller::addLine(){
CsvLine*项目=(CsvLine*)malloc(sizeof(CsvLine));
if(this->first==NULL){
此->第一个=项目;
此->最后一个=项目;
}否则{
此->上一个->下一个=项目;
项目->上一个=此->最后一个;
此->最后一个=项目;
}
}
void csvcontroller::addColumn(CsvLine*行,字符串*值){
CSV列*列=(CSV列*)malloc(sizeof(CSV列));
col->value=value;//问题出在这里
如果(行->第一个==NULL){
行->第一个=列;
行->最后一个=列;
}否则{
行->上一个->下一个=列;
列->上一个=行->最后一个;
行->最后一个=列;
}
}
/*
*获取并设置
*/
CsvLine*csvcontroller::getFirst(){
返回此->第一;
}
CsvLine*csvcontroller::getLast(){
返回这个->最后一个;
}
main.cpp:

#include <iostream>
#include <csvcontroller.h>

using namespace std;

int main(){

    csvcontroller lista_logradouros;
    lista_logradouros.loadfile("C:\\Users\\d786282\\Desktop\\Base_JUN_V2\\20140828_base_jun_padronizada.csv",';');
    CsvLine* aux = lista_logradouros.getFirst();
    do{
        aux = aux->next;
    }while(aux != NULL);


}
#包括
#包括
使用名称空间std;
int main(){
CSV控制器lista_logradouros;
lista_logradouros.loadfile(“C:\\Users\\d786282\\Desktop\\Base_JUN_V2\\20140828_Base_JUN_padronizada.csv,”;);
CsvLine*aux=lista_logradouros.getFirst();
做{
aux=aux->next;
}while(aux!=NULL);
}

如何调试/解决此问题?

在标题“csvcontroller.h”中,您似乎已定义了如下CsvColumn类:

typedef struct CsvColumn{

    struct CsvColumn* previous = NULL;
    string value = NULL;
    struct CsvColumn* next = NULL;

};
但你的任务是:

void csvcontroller::addColumn(CsvLine* line,string* value){

    CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
    col->value = value;
您正试图通过赋值运算符将指向std::string的指针转换为std::string。您可以解除指针的引用以使操作成为副本:

col->value = *value;
或者,您可以将代码更改为按ref而不是指针获取字符串(这是我的建议):

显然,这取决于您对应用程序的要求


干杯!

使用所有警告和调试信息(
g++-Wall-g
)编译。使用调试器(
gdb
)和内存泄漏检测器(…)。“如何调试/解决此问题?”您可以使用像gdb这样的体面调试器(取决于实际的工具链)问题是:你需要学习C++,你需要一本体面的书,试着忘记或至少质疑你的一些C习惯,因为你的代码将一些C++特性混合到了C核心的代码中,这是行不通的。这是不同的,因为它必须考虑到结构。它继续使用原始指针,或者最好不使用指针,使用标准容器代替自滚动链表,而不是返回值,C++转换(当不可避免)时,不需要使用结构类型的容器。。我有两秒钟的时间,非常抱歉,但我的意思是不能用
NULL
初始化字符串。还有其他问题,例如使用
eof()
不正确。您不能保证
line
将只是一个空行,而不是读取失败。您已经捕获了该问题,但使用了malloc()为一个对象分配存储(并且不构造它)不是一个合适的解决方案。这是一个合理的观点,但Danilo问为什么会这样。我选择在没有我的意见的情况下:代码结构有利于解决特定的问题。根据我的经验,试图找到“纯”C++有点像找到HFalalPoMP。减少你的问题,使用<代码> STD::矢量和<代码> STD::列表< /C>。CsvColumn应该包含一个字符串对象。对于ctor来说,这是第一个问题。如果你调用了ctor,这将是第一个问题。相反,在赋值时,字符串会释放它以前的内容,这在当时是随机垃圾,它会很乐意地传递给free()进行释放。否
void csvcontroller::addColumn(CsvLine* line,const string& value){

    CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
    col->value = value;