我有这样的代码:
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。的时候抛出异常。 p>
答案 0 :(得分:4)
temp
结构中绝对没有意义。见,
vec.push_back(temp);
已经在使用复制构造函数,因此复制构造函数必须工作,然后strcpy
的集合没有做任何不同的事情,所以只需要使用
vec.push_back(master[0]).
您无法直接读取矢量。你需要阅读临时的。这是正确的。除非我想要读取文件中的所有条目,无论它们有多少,所以你需要将读取本身也放入循环中。
创建一个元素的数组没什么意义。
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.
是等价的。我会选择以后的。
所以我们基本上都是:
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;
}
在第二个示例中,您没有初始化master
,因此它显然已崩溃。
虽然有更多的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>());
并且标准库将为您生成上述循环。