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

Флаги при работе с бинарными файлами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 15:50     Флаги при работе с бинарными файлами #1
Всем привет!
Ребята, не могу понять почему у меня удаляются данные из файла.

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

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

Создание файла
C
1
2
3
4
5
fstream FileStreet ( L"Streets.dat",ios::binary  );
    if ( !FileStreet ) 
    {
        ErrorAddClient(L"Невозможно открыть файл\"Streets.dat\"!");
    }
Запись в файл

C
1
2
3
4
5
ofstream FileStreet (L"Streets.dat", ios::ate  );
    if ( !FileStreet ) 
        ErrorAddClient(L"Невозможно открыть файл\"Streets.dat\"!");
    FileStreet.write (reinterpret_cast<const char *>( &street ),sizeof( EditorStreet ) );
        InformationAboutEvent(L"Улица добавлена");
И периодично я в программе открываю файл для чтения

C
1
2
3
4
5
6
ifstream FileStreet ( L"Streets.dat", ios::binary | ios::in);
    if(!FileStreet)
    {
        ErrorAddClient(L"Невозможно открыть файл \"Streets.dat\"");
        return;
    }
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2012, 15:50     Флаги при работе с бинарными файлами
Посмотрите здесь:

Проблемы при работе с файлами C++
C++ Работа с бинарными файлами
C++ Работа с Бинарными файлами
C++ Информация по работе с бинарными файлами
Ошибка при работе с файлами C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:00     Флаги при работе с бинарными файлами #2
Создание файла
Это не создание, а открытие для чтения и записи. Файл уже должен существовать. Данные при открытии не стирается.
cybersonner
 Аватар для cybersonner
97 / 48 / 3
Регистрация: 24.12.2011
Сообщений: 101
02.08.2012, 17:01     Флаги при работе с бинарными файлами #3
тут я не понимаю, на чем ты пишешь. но, в апи есть функция SetFilePointer
C
1
SetFilePointer(hFile, 0, 0, FILE_END);
то есть установить на 0 позицию с конца.
поищи, у тебя тоже должна быть такая функция.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:02     Флаги при работе с бинарными файлами #4
Цитата Сообщение от Holsteng Посмотреть сообщение
Запись в файл
Это создание файла (если не было) и открытие для записи. Если файл уже существовал, то данные из него стираются.
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 17:05  [ТС]     Флаги при работе с бинарными файлами #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Это не создание, а открытие для чтения и записи. Файл уже должен существовать. Данные при открытии не стирается.
А каким флагом создается файл?

Добавлено через 2 минуты
Цитата Сообщение от cybersonner Посмотреть сообщение
тут я не понимаю, на чем ты пишешь. но, в апи есть функция SetFilePointer
C
1
SetFilePointer(hFile, 0, 0, FILE_END);
то есть установить на 0 позицию с конца.
поищи, у тебя тоже должна быть такая функция.
А где мне взять hFile?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:09     Флаги при работе с бинарными файлами #6
Цитата Сообщение от Holsteng Посмотреть сообщение
ofstream FileStreet (L"Streets.dat", ios::ate )
Для добавления в конец файла, нужно так:
C++
1
ofstream FileStreet (L"Streets.dat", ios::app)
Добавлено через 3 минуты
Для создания (один раз) :
C++
1
 ofstream FileStreet ( L"Streets.dat", ios::binary  );
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 17:09  [ТС]     Флаги при работе с бинарными файлами #7
Уважаемый alsav22, не хочу сомневаться в вашей компетентности, но взял в книге Дейтелов по ate такую фразу
C
1
2
3
Открыть файл для вывода и переместиться в конец файла 
(обычно применяется для дописывания данных в конец файла). 
Данные могут быть записаны в любое место файла
.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:15     Флаги при работе с бинарными файлами #8
Если уже создан, создание обходить, и открывать для записи в конец или для чтения. После каждого открытия, не забывать закрывать.

Добавлено через 1 минуту
Цитата Сообщение от Holsteng Посмотреть сообщение
Уважаемый alsav22, не хочу сомневаться в вашей компетентности
Можете вполне сомневаться, но советую вот так дописывать в конец файла:
C++
1
ofstream FileStreet (L"Streets.dat", ios::app);
Добавлено через 2 минуты
С ate , помню, была заморочка. Но ни что не мешает проверить, как лучше.
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 17:29  [ТС]     Флаги при работе с бинарными файлами #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Если уже создан, создание обходить, и открывать для записи в конец или для чтения. После каждого открытия, не забывать закрывать.

Добавлено через 1 минуту

Можете вполне сомневаться, но советую вот так дописывать в конец файла:
C++
1
ofstream FileStreet (L"Streets.dat", ios::app);
Написал как вы советовали, но вылетает, что невозможно открыть файл

Код
void CableTV::FileForStreet()
{
	fstream FileStreet ( L"Streets.dat",ios::binary );
	if ( !FileStreet ) 
	{
		ErrorAddClient(L"Невозможно открыть файл\"Streets.dat\"!");
	}
	
}
А как обходить создание, если при запуске проргаммы срабатывает функция создания, может использовать флаг _Nocreate?

C
1
2
3
4
5
ofstream FileStreet ( L"Streets.dat",ios::binary | ios::_Noreplace );
    if ( !FileStreet ) 
    {
        ErrorAddClient(L"Невозможно открыть файл\"Streets.dat\"!");
    }
файл создается, но выскакивает ошибка, странно все это

Добавлено через 13 минут
Использовал ios::_Noreplace
C
1
2
3
4
5
ofstream FileStreet ( L"Streets.dat",ios::binary | ios::_Noreplace );
    if ( !FileStreet ) 
    {
        ErrorAddClient(L"Невозможно открыть файл\"Streets.dat\"!");
    }
данные в файле не стираются,но вылетает ошибка, почему?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:30     Флаги при работе с бинарными файлами #10
Сейчас проверил открытие с флагом ate. При открытии для записи, происходит стирание данных. Если открыть для чтения или для чтения и записи, то нормально.
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 17:31  [ТС]     Флаги при работе с бинарными файлами #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Сейчас проверил открытие с флагом ate. При открытии для записи, происходит стирание данных. Если открыть для чтения или для чтения и записи, то нормально.
Когда была такая ерунда, вспоминаю...
А что если не закрою поток? При выходе из блока он не закроется сам?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:41     Флаги при работе с бинарными файлами #12
Давайте по порядку. Не нужно дёргаться. Обход делается, например, так. Открывается для чтения и записи, если неудача, то создаётся (открывается для записи). Теперь, почему не открывается. Проверьте имя. Есть ли ли в папке проекта такой файл.

Добавлено через 1 минуту
Цитата Сообщение от Holsteng Посмотреть сообщение
А что если не закрою поток?
Бывали заморочки, поэтому нужно закрывать, перед следующим открытием.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
02.08.2012, 17:43     Флаги при работе с бинарными файлами #13
При выходе из блока он не закроется сам?
Закроется.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:44     Флаги при работе с бинарными файлами #14
L уберите перед названием файла.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
02.08.2012, 17:45     Флаги при работе с бинарными файлами #15
Бывали заморочки, поэтому нужно закрывать, перед следующим открытием.
В таких случаях иногда стоит делать еще и clear().
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 17:48  [ТС]     Флаги при работе с бинарными файлами #16
Открывается для чтения и записи, если неудача, то создаётся (открывается для записи)
То есть надо писать так?

C
1
2
3
4
5
ofstream FileHome ( L"NumberHomes.dat",ios::binary | ios::_Noreplace );
    if ( !FileHome ) 
    {
        ifstream FileHome ( L"NumberHomes.dat",ios::binary | ios::in)
    }
Я Вас правильно понял?
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
02.08.2012, 17:50     Флаги при работе с бинарными файлами #17
C++
1
ofstream FileHome ("NumberHomes.dat",ios::binary | ios::app );
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2012, 17:51     Флаги при работе с бинарными файлами #18
Цитата Сообщение от Avazart Посмотреть сообщение
В таких случаях иногда стоит делать еще и clear().
Особенно, если ошибка при открытии.

Добавлено через 38 секунд
Holsteng, точную строчку открытия, когда не открывается.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,561
Записей в блоге: 17
02.08.2012, 17:52     Флаги при работе с бинарными файлами #19
Чаще при достижении конца файла
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2012, 17:53     Флаги при работе с бинарными файлами
Еще ссылки по теме:

Задача с бинарными файлами C++
C++ Работа с бинарными файлами: какой способ работает наиболее быстро при записи и считывании?
Работа с бинарными файлами и структурами C++

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

Или воспользуйтесь поиском по форуму:
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
02.08.2012, 17:53  [ТС]     Флаги при работе с бинарными файлами #20
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
ofstream FileHome ("NumberHomes.dat",ios::binary | ios::app );
Код
ofstream FileHome ("NumberHomes.dat",ios::binary | ios::app )
Это в теле if писать?

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Особенно, если ошибка при открытии.

Добавлено через 38 секунд
Holsteng, точную строчку открытия, когда не открывается.
C
1
2
3
4
5
ofstream FileHome ( "NumberHomes.dat",ios::binary | ios::_Noreplace );
    if ( !FileHome ) 
    {
        ErrorAddClient(L"Невозможно открыть файл\"NumberHomes.dat\"!");
    }
Yandex
Объявления
02.08.2012, 17:53     Флаги при работе с бинарными файлами
Ответ Создать тему
Опции темы

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