Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2013, 13:55   #1
David Villa
Пользователь
 
Аватар для David Villa
 
Регистрация: 24.12.2011
Сообщений: 54
По умолчанию Запись вектора в файл и его чтение

Здравствуйте. Возникла такая проблема: У меня есть свой класс

Код:
class CType {
 public:
   CType () {is_empty=true; is_show=false; visible=true;}
   AnsiString type_var;
   AnsiString name_type;
   AnsiString name_var;
   bool is_empty;
   bool is_show;
   bool visible; 
};
я создаю вектор из элементов этого класса, в ходе выполнения программы его элементы меняются.

Как мне сохранить этот вектор в файл, чтобы в дальнейшем я мог его загрузить?

Пробовал такой вариант:

Код:
vector <CType> to_save(100);
Сохранение:

Код:
std::ofstream out_file("vector.bin", std::ios::binary | std::ios::out);
out_file.write((const char*)&to_save.front(), to_save.size() * sizeof(CType));
Сохранение произошло, файл создался.

Загрузка:

Код:
to_save.resize(100);
std::ifstream in_file("vector.bin", std::ios::binary);
in_file.read((char*)&to_save.front(), to_save.size() * sizeof(CType));
загрузка тоже происходит, но при попытке получить данные из этого вектора появляется "Acces violation...".

Как я понял, вся проблема в том, что в моем классе содержатся элементы AnsiString, если их заменить, например, на int, то все работает нормально.
David Villa вне форума Ответить с цитированием
Старый 27.10.2013, 13:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Правильно думаешь.
Придется тебе либо использовать массив символов, причем фиксированной длины, либо писать отдельно функцию сохранения данных в цикле по вектору, ну и считывание точно так же.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.10.2013, 14:09   #3
David Villa
Пользователь
 
Аватар для David Villa
 
Регистрация: 24.12.2011
Сообщений: 54
По умолчанию

где использовать массив? вместо AnsiString? тогда я могу проще заменить его на char*, с ним все работает, но очень не хочется переделывать свой класс, так как написано уже очень много функций для этого класса...
David Villa вне форума Ответить с цитированием
Старый 27.10.2013, 16:10   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

David Villa

в простейшем случае тебе нужно переопределеить операторы потокового ввода/вывода, например

Код:
// запись в поток
std::ostream& operator<<(std::ostream& os, const CType& v)
{
   return os << v.type_var << " " << v.name_type << " " << v.name_var << v.is_empty << " " << v.is_show << " " << v.visible << std::endl;
}
чтение аналогично

использование:

std:fstream ofs(...);
ofs << to_save[0];

если тебе нужен именно бинарный формат записи, тогда придется вручную доставать и записывать данные из ansistring
Rififi вне форума Ответить с цитированием
Старый 27.10.2013, 16:20   #5
David Villa
Пользователь
 
Аватар для David Villa
 
Регистрация: 24.12.2011
Сообщений: 54
По умолчанию

А можно немного поподробнее? где это все переопределять и как потом всем этим пользоваться
David Villa вне форума Ответить с цитированием
Старый 27.10.2013, 16:22   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

David Villa

гоогле "c++ перегрузка оператора ввода вывода"
Rififi вне форума Ответить с цитированием
Старый 27.10.2013, 16:32   #7
David Villa
Пользователь
 
Аватар для David Villa
 
Регистрация: 24.12.2011
Сообщений: 54
По умолчанию

как переопределить оператор я знаю. Дальше что с этим делать?
David Villa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать файл-функцию, заменяющую максимальный элемент вектора средним значением всех его элементов. rinoolik Помощь студентам 0 29.04.2013 22:23
Чтение\запись в файл VirtualAngel Помощь студентам 2 12.02.2011 12:54
Чтение и запись из/в файл Pirotexnik Общие вопросы C/C++ 7 28.01.2011 16:54
Чтение и запись в файл Dycek Общие вопросы C/C++ 0 18.01.2011 15:04
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11