Извлечение из файла, запись в файл

Рейтинг: 2Ответов: 2Опубликовано: 19.04.2011

Добрый день, у меня есть структура

struct bird{   
    string name;  
    string type;   
    string habitat;   
    bool migrant;

    bird *next;   
};

мне нужно ее записать в файл, а потом извлечь. Пишу так(запись):

bird bTemp;   
ofstream output_file("Bird", ios::trunc);  
else {  
    while(fTemp != NULL) {   
        output_file.write((char*)&bTemp, sizeof(bird));   
         }  
    }

Извлечение

void ReadListFromFile() {   
    bird bTemp;  
    ifstream input_file("Bird");  
    if (!input_file.fail()) {  
        input_file.read((char*)&bTemp, sizeof(bird));  
    }  
}

В итоге создается двоичный файл, но при попытке чтения возникает ошибка сегментации

Ответы

▲ 3Принят

А чего вы, собственно, ожидали получить? У вас ведь экземпляры классов string да ещё указатель next.. как вы себе представляете чтобы такое работало? Вы мыслите номинально.. но вы должны думать о тех байтах, что вы туда пишете и о тех байтах, что читаете и пытаетесь потом использовать так будто они всегда были в памяти.

▲ 1

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

    struct bird{   
        string name;  
        string type;   
        string habitat;   
        bool migrant;
    };

+
    struct BIRD{
      bird label;
      bird *next;   
    };

Вы в файл должны записывать данные а не ссылки на них (bird *next). то есть переходя по ссылке вы записываете только данные структуры (bird label), А когда будете их считывать то используя цикл будете заново собирать их в структуру (struct BIRD). Думаю что поступив так, у вас не возник не проблем с записью данных не с их извлечением!