动态结构数组

时间:2017-04-24 10:51:04

标签: c++ arrays structure

我有这样的代码:

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();
}

做什么:它将结构从二进制文件读入结构数组,将它们复制到向量中并显示结构。是的,我确实需要这样做 - 我需要在vector中存储文件结构,这是唯一可行的方法我可以找到(如果你能说,如何直接从文件中读取结构 - 欢迎你)。

所以,一切正常,但问题是我需要创建一个能够做同样的功能,但是使用动态数组。我写了这样的东西:

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;

    }
 }

除非我试图运行它,否则它也运行良好。我的代码中没有突出显示错误,它只是在程序试图访问master [0] .name。

1 个答案:

答案 0 :(得分: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 ++方法。首先,为结构定义一个read运算符:

    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>());
    

    并且标准库将为您生成上述循环。