2015-10-26 3 views
-2

Как создать неизвестное количество объектов во время выполнения на C++, я читаю данные из текстового файла и не хочу тратить память, т.е. нет дополнительных объектовC++ Выделить память для неизвестного нет объектов, считанных из файла

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];  
} 

Мне нужно получить доступ к ячейке памяти после того, как я верну объект, и я не хочу, чтобы эта память исчезла. Теперь, как я могу выделить память и получить доступ к памяти во всей программе, не теряя ее.

+2

Что вы пробовали? Похоже, вам нужно динамическое распределение памяти с новым и удалить. – BurningLights

ответ

2

Если ваш текстовый файл имеет фиксированную ширину, вы можете определить, сколько объектов существует, разделив размер файла на размер каждого объекта.

Современные системы редко используют файлы фиксированной ширины. В этом случае ваша единственная альтернатива - выделить память, фактически прочитав файл. Прочитайте строку, выделите память для объекта, представленного этой линией. Продолжайте, пока файл не будет полностью прочитан. Нет памяти впустую.

Если вы пытаетесь предварительно выделить массив, не делайте этого. Вместо этого динамически выделяйте память, когда вы читаете строки.

Если вы должны использовать массив (например, ограничение домашней работы), вы можете прочитать файл дважды. Первый проход подсчитывает количество объектов, в которых вы нуждаетесь, затем выделяете массив соответствующего размера, затем вы снова читаете файл, чтобы заполнить массив. Это расточительно, так как он удваивает требования IO вашего алгоритма. В качестве альтернативы в этом случае вы можете выделить массив с комнатой для одного элемента (или для минимального количества ожидаемых элементов), а затем перераспределить массив для каждого дополнительного элемента, который вы читаете. Это довольно неэффективно, поскольку оно в обычно требуется новое распределение памяти и копирование старых данных массива в новую память массива для каждого нового объекта.

+0

Это не вариант * только *. Он также может выполнять кучу вызовов realloc или 'new []', 'memcpy',' delete [] 'вызовов. – CoffeeandCode

+0

Вы заявляете, что он неэффективен, но вы должны включить, что 'std :: vector' работает именно таким образом. Кроме того, было бы интересно сравнить, было ли менее эффективным, чтобы двойной файл читался. – CoffeeandCode