动态地分配存储器中C来自文件读出时为结构++(dynamically allocating memo

2019-08-01 16:26发布

我有一个结构

typedef struct student
{
    char name[10];
    int age;
    vector<int> grades;
} student_t;

我正在写的内容为二进制文件。

我写在不同的时间,并且对文件许多数据是从这个结构写的。

现在,我想阅读所有有关于二进制文件到结构中的数据。 我不知道我该怎么分配内存(动态)的结构,这样的结构可以容纳到结构中的所有数据。

能否请您帮我出这一点。

码:

#include <fstream>
#include <iostream>
#include <vector>
#include <string.h>
#include <stdlib.h>
#include <iterator>

using namespace std;


typedef struct student
{
    char name[10];
    int age;
    vector<int> grades;
}student_t;

int main()
{
    student_t apprentice[3];
    strcpy(apprentice[0].name, "john");
    apprentice[0].age = 21;
    apprentice[0].grades.push_back(1);
    apprentice[0].grades.push_back(3);
    apprentice[0].grades.push_back(5);

    strcpy(apprentice[1].name, "jerry");
    apprentice[1].age = 22;
    apprentice[1].grades.push_back(2);
    apprentice[1].grades.push_back(4);
    apprentice[1].grades.push_back(6);

    strcpy(apprentice[2].name, "jimmy");
    apprentice[2].age = 23;
    apprentice[2].grades.push_back(8);
    apprentice[2].grades.push_back(9);
    apprentice[2].grades.push_back(10);

    // Serializing struct to student.data
    ofstream output_file("students.data", ios::binary);
    output_file.write((char*)&apprentice, sizeof(apprentice));
    output_file.close();

    // Reading from it
    ifstream input_file("students.data", ios::binary);
    student_t master;

    input_file.seekg (0, ios::end);
    cout << input_file.tellg();

    std::vector<student_t> s;

    // input_file.read((char*)s, sizeof(s)); - dint work

    /*input_file >> std::noskipws;
    std::copy(istream_iterator(input_file), istream_iterator(), std::back_inserter(s));*/

    while(input_file >> master) // throws error
    {
        s.push_back(master);
    }
    return 0;
}

Answer 1:

您应该使用vector<student_t>代替旧式阵列。 它会处理动态分配(使用push_back()添加项目),您可以用得到它的尺寸size()方法。

编辑:对于文件读取,你可以这样做:

ifstream myfile;
myfile.open(file_name);
if (myfile.is_open()) {
    while (myfile) {
        string s;
        getline(myfile, s);
        // Do something with the line
        // Push information into students vector
    }
}

不要忘记添加二元期权了。

对于name的内部student_t结构,这将是很容易将其声明为一个string 。 这样,您就不必使用strcpy之类,你可以只输入mystudent.name = "jimmy"



Answer 2:

最直接的方法是解包载体,让你写的文件究竟是不是一个向量而是整数与数组中的整型数一起的数组。

所以第一遍是写的是有一个标准的,不变的结构,然后一个数字,表示将跟随,最后遍历向量写入整数到整数的文件的数量的第一部分。

然后,当你阅读文件,你会创建一个空的载体结构,阅读是结构性的和不变的进入结构中的第一部分,然后读取整数的数量被放置在载体中,然后阅读数的int从文件。 当你阅读该文件中的整数你将它们添加到在结构中的载体。



Answer 3:

您需要发明一种文件格式此。 在文件的开头要存储一个所谓的“头”,其中包含有关其包含的数据信息。 例如:

2 13 <DATA> 8 <DATA>

第一个数字(2)给出文件中存储的结构体的量。 然后,数据块跟随。 每一个数据块开始于数字,指定的大小grades矢量(13用于第一结构,8为第二)。

在这种情况下,从文件中读取的开始一个int。 现在你知道该文件具有保存在其2层结构。 然后,你看在这种情况下未来INT,13。 这告诉你,你需要的13容量的载体可以创建一个,然后读取所有的值。 你会知道什么时候停止,因为你知道你有多少数据在这个结构:10个字符(名称),1个INT(岁),13个整数(等级)。 您已经阅读一切之后,你就知道,未来INT将文件中的下一个结构的一部分。 这将是8号,它告诉你,未来需要结构容量8的矢量。

等,等,直到你读完一切。

需要注意的是二进制文件,我的这个方法/ O是不可移植。 有两个原因。 首先,int的长度可以在平台之间的差异。 其次,一个int(和其他数据比单个字节更大)都以二进制形式存储的方式可以不同也一样,即使它们具有相同的尺寸(见http://en.wikipedia.org/wiki/Endianness一个解释。)但是,如果你不打算你的程序并生成可移植反正文件,然后我上述的方法就足够了。



文章来源: dynamically allocating memory to struct when reading from file in C++
标签: c++ struct