2012-04-20 72 views
2

我想讀取二進制文件並將其存儲到數據庫中,但是當我嘗試將字符串類型存儲到數據庫中時出現分段錯誤。確切的說,推函數內部發生錯誤:從二進制文件中讀取行C++

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++; 
} 
+1

只是挑剔,但在二進制文件中沒有_lines_。 – 2012-04-20 05:47:38

回答

3

此代碼是壞:

 infile.read((char*)(name.c_str()), sizeof(string)); 

不能寫入由c_str()返回的緩衝區,它不能保證足夠長的時間來保存您的結果。順便說一下,sizeof(string)與字符串可容納的大小無關。您需要分配您自己的char[]緩衝區來保存infile.read的結果,然後再轉換爲string

+0

如果我沒有錯,我不得不知道字符串或char *的大小?無論如何要這樣做?還說如果我做infile.read(名字,100);並有字符名稱[100],這是否意味着我會在接下來的100個字符中讀取?謝謝您的幫助。 – dajee 2012-04-20 20:44:16

+0

你需要一些指示字符串的時間長度,這一切都取決於字符串如何存儲在第一位。它們是否以null結尾? Newline終止了?固定長度? – 2012-04-20 21:13:11

+0

名稱被冒號終止,並且crns - 可以從1到3的範圍是換行符終止 – dajee 2012-04-20 21:19:06