Сегодня нужно было выделить время и написать небольшую записную книжечку для хранения адресов, фамилий, телефонов. Выделил время вечером - думал как раз справлюсь и на боковую. Не тут то было.
Для хранения данных использовал структуру, а для хранения структур решил использовать список (list) из STL. Хотелось еще попрактиковаться в написании своего шаблонного класса, но т.к. работы по горло и без этого решил использовать вариант STL.
Решил записывать структуры поочередно в файл следующим способом:
FILE *file; fopen_s( &file, "data.dat", "wb+" );
{
for(iter=spisok.begin();iter!=spisok.end();iter++)
{
//Запись ведется поструктурно (структура ent)
fwrite(&iter,sizeof(ent),1,file);
}
} fclose(file);
А для чтения из файла решил использовать код:
while (!feof(file))
{
ent e;
fread(&e,sizeof(ent),1,file);
spisok.push_back(e);
}
Программа компилируется, ошибок не вызывает, все работает корректно до тех пор пока не производится чтение из файла. Тогда при выводе в соответствующие поля выводится буква "B" и один иероглиф.
Чего я только не испробовал, даже вместо while (!feof(file)) вычислял размер файла, делил на размер структур - вычислял столько в файле записанных полей, но все верно, однако программа не работала.
Оказалось проблема была элементарной - вместо
fwrite(&iter,sizeof(ent),1,file)
нужно писать
fwrite(&(*iter),sizeof(ent),1,file)
Все глупо и элементарно - итератор, ведь, должен использоватся разименованым, если мы имеем дело с данными, которые хранит текущий узел динамической структуры. А так мы просто записывали данные итератора в файл, которые кроме билеберды ничего для человека не представляют.
Теперь я раз и навсегда запомню этот поход по граблям.
Уже почти 3 утра, пошел спать...

Оставить комментарий