2017-04-24 87 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 >>'中做正确的格式化输入。 –