我正在尝试读取二进制文件并将其存储到数据库中,但是当我尝试将字符串类型存储到数据库中时,我遇到了分段错误。确切地说,错误发生在push函数内:
new_node->name = name;
我似乎无法在网上找到一个好的解决方案,而且我漫无目的地尝试不同的事情......任何帮助都会受到赞赏。
//
// loadbin.cpp
//
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
#include "studentsDB.h"
int main( int argc, char* argv[] ) {
string name;
string id;
int numCourses;
int crn;
vector<int> crns;
studentsDB sDB;
studentsDB::node *students = 0;
int in = 1;
if( argc > 1 ) {
ifstream infile(argv[in], ios::binary );
while( !infile.eof() ) {
infile.read( ( char* )(name.c_str()), sizeof( string ) );
infile.read( ( char* )(id.c_str()), sizeof( string ) );
infile.read( ( char* ) &numCourses, sizeof( int ) );
do{
crns.push_back( crn );
}
while( infile.read( ( char* ) &crn, sizeof( int ) ) );
sDB.push( &students, (string)name, (string)id, numCourses, crns );
}
//sDB.printList( students );
}
else
cout << "Not enough argument" << endl;
}
void studentsDB::push( struct node** head_ref, string name, string id,
int numCourses, vector<int>crns ) {
struct node* new_node = ( struct node* ) malloc(sizeof(struct node));
new_node->name = name;
//new_node->id = id;
new_node->numCourses = numCourses;
//new_node->crns = crns;
new_node->next = (*head_ref);
(*head_ref) = new_node;
size++;
}
答案 0 :(得分:3)
这段代码很糟糕:
infile.read( ( char* )(name.c_str()), sizeof( string ) );
您无法写入c_str()
返回的缓冲区,但不能保证足够长时间来保存您的结果。顺便说一下,sizeof(string)
与字符串可以容纳的大小无关。您需要分配自己的char[]
缓冲区来保存infile.read
的结果,然后再转换为string
。