名称>>级别; strcpy(数据[i].名称,名称); 数据[i]。级别=级别; 数据[i].id=i; ptr[i]=&数据[i]; cout,c++,object,memory,text-files,C++,Object,Memory,Text Files" /> 名称>>级别; strcpy(数据[i].名称,名称); 数据[i]。级别=级别; 数据[i].id=i; ptr[i]=&数据[i]; cout,c++,object,memory,text-files,C++,Object,Memory,Text Files" />

C++;为从文件中读取的未知数量的对象分配内存 如何在C++运行时创建未知的对象,我正在从文本文件中读取数据,不想浪费任何内存,也就是说没有额外的对象< /p> Player* g_data() { system("cls"); char name[40];int level; fstream file; file.open("data.txt",ios::app|ios::in|ios::out); Player data[40],*ptr[100]; int i=0; while(!file.eof()&&i<100) { file >>name>>level; strcpy(data[i].name,name); data[i].level=level; data[i].id=i; ptr[i]=&data[i]; cout<<"Address-"<<ptr[i]<<"data"<<ptr[i]->name<<"id"<<ptr[i]->id<<endl; i++; } system("pause"); return ptr[i-1]; } Player*g_data() { 系统(“cls”); 字符名[40];int级别; 流文件; 打开(“data.txt”,ios::app | ios::in | ios::out); 播放器数据[40],*ptr[100]; int i=0; 而(!file.eof()&&i>名称>>级别; strcpy(数据[i].名称,名称); 数据[i]。级别=级别; 数据[i].id=i; ptr[i]=&数据[i]; cout

C++;为从文件中读取的未知数量的对象分配内存 如何在C++运行时创建未知的对象,我正在从文本文件中读取数据,不想浪费任何内存,也就是说没有额外的对象< /p> Player* g_data() { system("cls"); char name[40];int level; fstream file; file.open("data.txt",ios::app|ios::in|ios::out); Player data[40],*ptr[100]; int i=0; while(!file.eof()&&i<100) { file >>name>>level; strcpy(data[i].name,name); data[i].level=level; data[i].id=i; ptr[i]=&data[i]; cout<<"Address-"<<ptr[i]<<"data"<<ptr[i]->name<<"id"<<ptr[i]->id<<endl; i++; } system("pause"); return ptr[i-1]; } Player*g_data() { 系统(“cls”); 字符名[40];int级别; 流文件; 打开(“data.txt”,ios::app | ios::in | ios::out); 播放器数据[40],*ptr[100]; int i=0; 而(!file.eof()&&i>名称>>级别; strcpy(数据[i].名称,名称); 数据[i]。级别=级别; 数据[i].id=i; ptr[i]=&数据[i]; cout,c++,object,memory,text-files,C++,Object,Memory,Text Files,如果文本文件是固定宽度的,则可以通过将文件大小除以每个对象的大小来确定有多少个对象 现代系统很少使用固定宽度的文件。在这种情况下,唯一的选择是通过实际读取文件来分配内存。读取一行,为该行表示的对象分配内存。继续,直到文件完全读取。不会浪费内存 如果您试图预分配数组,请不要这样做。相反,请在读取行时动态分配内存 如果必须使用数组(例如家庭作业约束),您可以读取文件两次。第一次通过计算需要空间的对象数,然后分配一个适当大小的数组,然后再次读取文件以填充数组。这是浪费,因为它会使算法的IO要求翻倍。或

如果文本文件是固定宽度的,则可以通过将文件大小除以每个对象的大小来确定有多少个对象

现代系统很少使用固定宽度的文件。在这种情况下,唯一的选择是通过实际读取文件来分配内存。读取一行,为该行表示的对象分配内存。继续,直到文件完全读取。不会浪费内存

如果您试图预分配数组,请不要这样做。相反,请在读取行时动态分配内存


如果必须使用数组(例如家庭作业约束),您可以读取文件两次。第一次通过计算需要空间的对象数,然后分配一个适当大小的数组,然后再次读取文件以填充数组。这是浪费,因为它会使算法的IO要求翻倍。或者,在这种情况下,您可以为一个el分配一个具有空间的数组ement(或您期望的最小元素数),然后为您读入的每个附加元素重新分配数组。这是相当低效的,因为它通常需要新的内存分配,并将旧数组数据复制到每个新对象的新数组内存中。

您尝试了什么?听起来您需要使用new和delete动态内存分配。这不是o只有一个选项。他还可以执行一系列
realloc
调用或
new[]
memcpy
delete[]
调用。您可以说这是低效的,但您应该包括
std::vector
也正是以这种方式工作的。此外,比较双文件读取是否效率较低也很有趣。