2017-04-24 128 views
1

我有這樣一段代碼:結構的動態陣列

typedef struct reader 
{ 
    char name[50]; 
    char card_num[50]; 
    char title[100]; 
}reader_t; 
int main() 
{ 
    vector<reader> vec; 
    ifstream input_file("D:\\lab.txt", ios::binary); 
    reader_t master[1]; 
    input_file.read((char*)&master, sizeof(master)); 

    for (size_t idx = 0; idx < 1; idx++) 
    { 
     reader temp; 
     strcpy(temp.name, master[idx].name); 
     strcpy(temp.card_num, master[idx].card_num); 
     strcpy(temp.title, master[idx].title); 
     vec.push_back(temp); 

     cout << "Name: " << master[idx].name << endl; 
     cout << "Card num: " << master[idx].card_num << endl; 
     cout << "Title: " << master[idx].title<<endl; 

    } 
    cout << vec.size(); 

    getchar(); 
} 

這是確實的:它讀取結構從二進制文件到結構的陣列,將它們複製到載體並顯示structure.And是的,我需要做這樣的事情 - 我需要在向量中存儲文件中的結構,這是我能找到的唯一可行的方式(如果可以告訴,如何讀取結構以直接從文件向量 - 不用擔心)。

所以,一切工作正常,但問題是,我需要創造條件,能夠做同樣的功能,但動態array.I寫了這樣的事情:

void read_structs(int vec_size) 
{ 
    ifstream input_file("D:\\lab.txt", ios::binary); 

    //Here I commented 2 ways how I tried to create a dynamic array of structs 
    //reader* master = new reader[vec_size]; 
    //reader* master = (reader*)malloc(sizeof(reader) * vec_size); 

    input_file.read((char*)&master, sizeof(master)); 
    for (size_t idx = 0; idx < vec_size; idx++) 
    { 

     reader temp; 
     strcpy(temp.name, master[idx].name); 
     strcpy(temp.card_num, master[idx].card_num); 
     strcpy(temp.title, master[idx].title); 
     vec.push_back(temp); 

     cout << "Name: " << master[idx].name << endl; 
     cout << "Card num: " << master[idx].card_num << endl; 
     cout << "Title: " << master[idx].title<<endl; 

    } 
} 

這除非我試圖運行它,否則工作得很好.VS在我的代碼中並沒有出現嚴重錯誤,它只是在程序試圖訪問master [0] .name時引發異常。

+0

「vec_size」的值是什麼? – ameyCU

+0

@ameyCU當我運行我使用的程序1 – NightStallion

+4

只需使用['std :: vector'](http://en.cppreference。com/w/cpp/container/vector) – StoryTeller

回答

4
  1. temp結構中絕對沒有意義。你看,

    vec.push_back(temp); 
    

    已經使用拷貝構造函數,所以拷貝構造函數必須工作,然後設定的strcpy沒有做任何事情,從不同的,所以只是去與

    vec.push_back(master[0]). 
    
  2. 你可以用」直接讀入向量。你確實需要讀入臨時。所以這是正確的。除了我想你要讀取文件中的所有條目,無論它們有多少,所以你需要將讀取本身也放入循環中。

  3. 創建一個元素的數組沒有太大意義。

    reader_t master[1]; 
    input_file.read((char*)master, sizeof(master)); 
    //     ^you *don't* need & here, arrays degrade to pointers automatically 
    

    reader_t master; 
    input_file.read((char *)&master, sizeof(master)); 
    //     ^but you do need & here. 
    

    是等價的。我會跟隨後者。

  4. 所以我們基本上下降到:

    reader temp; // calling it temp; the master name makes no sense. 
    while (input_file.read((char*)&temp, sizeof(temp))) 
    // read returns input_file and input_file is false if last operation failed 
    { 
        vec.push_back(temp); 
    
        // verify the stored values by reading back vfrom vec.back(). 
        cout << "Name: " << vec.back().name << endl; 
        cout << "Card num: " << vec.back().card_num << endl; 
        cout << "Title: " << vec.back().title<<endl; 
    } 
    
  5. 在第二個例子中,你沒有初始化master,因此很明顯墜毀。

  6. 雖然有更多的C++方法。首先,定義一個讀取操作員的結構:

    std::istream &operator>>(std::istream &in, reader &r) { 
        return in.read((char *)&r, sizeof(r)); 
    } 
    

    然後你只需使用istream_iterator讀取的矢量:

    vec.assign(std::istream_iterator<reader>(input_file), 
          std::istream_iterator<reader>()); 
    

    和標準庫將爲您生成上述循環。

+0

裏面寫下'reader'和'reader_t'這個名字,這就是我在評論中所說的,ty用於在步驟中輸入它。 Idk如果你在其他地方初始化主人。否則,你需要打印temp.name等。你不需要主人了。 – rinn2883

+0

或使用像編輯這樣的矢量打印也是一個選項。 – rinn2883

+0

@NightStallion,你將不得不做一些調試。文件實際上是否包含所有字節?請記住,名稱恰好爲50個字節,card_num正好爲50個字節,標題正好爲100個字節。如果你的意思是換行符或什麼的,你需要在'operator >>'中做正確的格式化輸入。 –