Форум программистов, компьютерный форум CyberForum.ru

Дописать в файл запись пользовательского класса - C++

Восстановить пароль Регистрация
 
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
03.04.2012, 22:40     Дописать в файл запись пользовательского класса #1
Стоит следующая задача - нужно дописать в файл запись пользовательского класса.
Есть пользовательский тип:
C++
1
2
3
4
5
6
7
class Hostel
{
public:
    string FIO;
    int GroupNumber;
    int RoomNumber;
};
Также есть вектор объектов класса Hostel, и перегрузка к нему:
C++
1
2
ofstream& operator << (ofstream& s, Hostel& obj)
    { s<<obj.FIO<<endl<<obj.GroupNumber<<endl<<obj.RoomNumber ;  return s;}
Метод записи в файл:
C++
1
2
3
4
5
6
7
    void WriteInFile(Hostel *hostel)
    {
        ofstream file;
        file.open("ReadMe.txt");
        file << *hostel;
        file.close();
    }
Проблема в том, что при попытке дописать данные, программа стирает уже существующие в файле.
С чем может быть связана такая проблема?

Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.04.2012, 22:40     Дописать в файл запись пользовательского класса
Посмотрите здесь:

пример пользовательского класса C++
C++ Запись пользовательского класса
C++ Запись данных класса в файл
Запись класса в файл C++
C++ запись класса в файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
03.04.2012, 23:58     Дописать в файл запись пользовательского класса #2
попытайся сделать указатель на файл

C++
1
2
3
4
5
6
7
8
FILE *file=NULL;
file=fopen("ReadMe.txt","a");
if(!file)
{
    return; //Или еще какое сообщение типо "Файл не найден"
}
fputs(*hostel,file);
fclose(file);
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.04.2012, 00:04     Дописать в файл запись пользовательского класса #3
Цитата Сообщение от DroidAn Посмотреть сообщение
C++
1
file.open("ReadMe.txt");
=>
C++
1
file.open("ReadMe.txt", ios::out | ios::app);
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
04.04.2012, 00:14     Дописать в файл запись пользовательского класса #4
Цитата Сообщение от kazak Посмотреть сообщение
ios::app
это за что отвечает?

аналог ios::out?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.04.2012, 00:19     Дописать в файл запись пользовательского класса #5
Это значит, что файл будет открыт на запись, и если файл существует, то будет открыт существующий файл и указатель в файле будет перемещен в конец файла. Запись будет происходить всегда в конец файла. Есть еще режим ios::ate, который аналогичен ios::app, с той лишь разницей, что позволяет записывать в любом месте в файле.
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
04.04.2012, 00:20     Дописать в файл запись пользовательского класса #6
Jazz411, строчки из документации
Opens file name and connects f to it. If the file does not already exist, an attempt is made to create it with protection mode prot unless ios::nocreate is set. By default, prot is filebuf::openprot, which is 0644. Failure occurs if f is already open, or the call to f.rdbuf()->open() fails. ios::failbit is set in f's error status on failure. The members of open_mode are bits that may be or'ed together. (Because the or'ing returns an int, open() takes an int rather than an open_mode argument.) The meanings of these bits in mode are:


ios::app
A seek to the end of file is performed. Subsequent data written to the file is always added (appended) at the end of file. On some systems this is implemented in the operating system. In others it is implemented by seeking to the end of the file before each write. ios::app implies ios::out.

ios::ate
A seek to the end of the file is performed during the open(). ios::ate does not imply ios::out.

ios::in
The file is opened for input. ios::in is implied by construction and opens of ifstreams. For fstreams it indicates that input operations should be allowed if possible. It is legal to include ios::in in the modes of an ostream in which case it implies that the original file (if it exists) should not be truncated. If the file being opened for input does not exist, the open will fail.

ios::out
The file is opened for output. ios::out is implied by construction and opens of ofstreams. For fstream it says that output operations are to be allowed. ios::out may be specified even if prot does not permit output.

ios::trunc
If the file already exists, its contents will be truncated (discarded). This mode is implied when ios::out is specified (including implicit specification for ofstream) and neither ios::ate nor ios::app is specified.

ios::nocreate
If the file does not already exist, the open() will fail.

ios::noreplace
If the file already exists, the open() will fail. Only valid with ios::out.
p.s. правда, насколько я знаю, ios::nocreate поддерживается не всеми компиляторами и не всеми платформами
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.04.2012, 00:22     Дописать в файл запись пользовательского класса #7
ios::binary нехватает.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
04.04.2012, 00:23     Дописать в файл запись пользовательского класса #8
а я ясно спасибо парни
DroidAn
7 / 7 / 0
Регистрация: 18.11.2011
Сообщений: 150
04.04.2012, 23:04  [ТС]     Дописать в файл запись пользовательского класса #9
Ребята, а как начинать "дописывать" в файл с новой строки?
Почему-то символы '\r' и '\n' не работают.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2012, 23:35     Дописать в файл запись пользовательского класса
Еще ссылки по теме:

Вектор объектов пользовательского класса C++
C++ Запись экземпляра класса в файл
C++ Не работает метод класса (запись и чтение в файл)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
04.04.2012, 23:35     Дописать в файл запись пользовательского класса #10
Цитата Сообщение от DroidAn Посмотреть сообщение
file << *hostel;
либо так
C++
1
file << *hostel << '\n';
либо так
C++
1
file << *hostel << endl;
Yandex
Объявления
04.04.2012, 23:35     Дописать в файл запись пользовательского класса
Ответ Создать тему
Опции темы

Текущее время: 05:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru