我正在唱C ++来构建一个用于研究目的的csv处理器,并且在分段错误方面有一些麻烦。 该处理器将有一个主类(csvcontroller),它应该是当前文件的实例。该类控制两个结构。其中一个(CsvLine)是所有文件行的列表,另一个(CsvColumn)表示每个列表中所有列的列表。 当我尝试将列值写入结构时,我发生了分段错误,但只有在我使用字符串时才会发生。如果我们用int替换string,那么处理器就会以我想要的方式运行。
这是我的代码:
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
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;
}
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);
}
我如何调试/解决这个问题?
答案 0 :(得分:1)
在你的标题'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。您可以将您的指针deref以使操作成为副本:
col->value = *value;
或者你可以改变你的代码来获取字符串by-ref,而不是by-pointer(这是我建议的):
void csvcontroller::addColumn(CsvLine* line,const string& value){
CsvColumn* col = (CsvColumn*) malloc(sizeof(CsvColumn));
col->value = value;
显然这取决于您对申请的要求。
干杯!