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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2009, 10:29   #1
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию файловый поток. Открыть\создать бинарник

Здравствуйте. Мне необходимо открыть бинарный файл для чтения\записи, если файла нет - создаётся.
По идее так должно работать:
Код:
fstream file("scinfo.bin",ios::in|ios::out|ios::binary);
Но файл не создаётся. Компилятор не ругается (VS2005)...
В нете рылся - нигде нет именно моего случая...

Вообще, если целиком окинуть функцию - нужно открыть\создать бинарник, и добавить структуру. Формат файла - первые 2 байта - количество записей, а дальше сплошняком структуры...
Предварительная версия:
Код:
int AddScanner(scan_info &sci)
{
	short int number=0;

	fstream file("scinfo.bin",ios::in|ios::out|ios::binary);
	if(!file)
	{
		return -1;
	}
	if(!file.eof())
	{
		file.read(reinterpret_cast<char*>(&number),sizeof(number));
	}
	number++;
	file.write(reinterpret_cast<const char*>(&number),sizeof(number));
	file.seekg(sizeof(number)+(sizeof(sci)*(number-1)));
	file.write(reinterpret_cast<const char*>(&sci),sizeof(sci));
	return 0;
}
Проблема описана выше - файл не создаётся...

Последний раз редактировалось Darth.Vader; 29.12.2009 в 10:35.
Darth.Vader вне форума Ответить с цитированием
Старый 29.12.2009, 17:59   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Думаю это связано с тем, что физически создать файл одновременно и для чтения и для записи невозможно. Из ситуации можно выйти сначала создав файл, к примеру, только для записи, затем закрыть его и снова открыть уже созданный файл для записи/чтения
Код:
fstream file("scinfo.bin", ios::out);
file.close();
file.open("scinfo.bin", ios::out | ios::in | ios::binary);
...
file.close(); // желательно закрывать файл, после окончания работы с ним.
netrino вне форума Ответить с цитированием
Старый 29.12.2009, 18:36   #3
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Думаю это связано с тем, что физически создать файл одновременно и для чтения и для записи невозможно. Из ситуации можно выйти сначала создав файл, к примеру, только для записи, затем закрыть его и снова открыть уже созданный файл для записи/чтения
Код:
fstream file("scinfo.bin", ios::out);
file.close();
file.open("scinfo.bin", ios::out | ios::in | ios::binary);
...
file.close(); // желательно закрывать файл, после окончания работы с ним.
Можно так создавать!
И деструктор сам закрывает файлы, а он вызовется при выхое из программы (удачном )
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 29.12.2009, 18:45   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Другое дело что у тебя, автор, файл открывается каждый раз при запуске этйо функции, а она у тебя на добавление не работает!!!
ios::app флаг нужен так же
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 29.12.2009, 19:00   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от RoS Посмотреть сообщение
Можно так создавать!
И деструктор сам закрывает файлы, а он вызовется при выходе из программы (удачном )
Серьёзно? И каким же образом Вы себе это представляете? )
Насчёт деструктора верно, в общем во многом это дело вкуса, кто что находит проще, я предпочитаю контролировать выделенные мною ресурсы
netrino вне форума Ответить с цитированием
Старый 29.12.2009, 19:53   #6
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию

Это попробую, спасибо. Тут проблема ещё одна: создал я этот файл вручную, всё как-бы работает, функция завершается корректно, но в файл ничего не пишется, и из него ничего не читается. Причём выполнение идёт гладко - трассировал... все функции (read и write) не вылетают... а файл как был 0 байт - так и остаётся...
Сегодня с преподом 2 пары втыкали - пришли к выводу, что нужен бубен - без него никак.
Darth.Vader вне форума Ответить с цитированием
Старый 29.12.2009, 19:53   #7
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Серьёзно? И каким же образом Вы себе это представляете? )
Насчёт деструктора верно, в общем во многом это дело вкуса, кто что находит проще, я предпочитаю контролировать выделенные мною ресурсы
Попробуй, потесть вполне адекватно работает
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 29.12.2009, 20:11   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от RoS Посмотреть сообщение
Попробуй, потесть вполне адекватно работает
Но тут совершенно другая история) Флаг ios::app провоцирует примерно следующую схему: открывает временный файл на запись, открывает файл, указанный первым параметром на чтение, пытается копировать в тот, что открыть для записи из открытого на чтение всё его содержимое, затем переоткрывает на запись, а тот на чтение и перебрасывает обратно, на лицо оверхед, разве не так? ) Не многим лучше того, что предложил я )
netrino вне форума Ответить с цитированием
Старый 29.12.2009, 20:58   #9
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Darth.Vader Посмотреть сообщение
Это попробую, спасибо. Тут проблема ещё одна: создал я этот файл вручную, всё как-бы работает, функция завершается корректно, но в файл ничего не пишется, и из него ничего не читается. Причём выполнение идёт гладко - трассировал... все функции (read и write) не вылетают... а файл как был 0 байт - так и остаётся...
Сегодня с преподом 2 пары втыкали - пришли к выводу, что нужен бубен - без него никак.
Посмотрел, вот строчки, провоцирующие подобное поведение:
Код:
	if(!file.eof())
	{
		file.read(reinterpret_cast<char*>(&number),sizeof(number));
	}
Дело в том, что при создании файла все флаги у него чисты, но как-только Вы пытаетесь прочитать что-либо, то тут же натыкаетесь на конец файла и выставляются флаги eof и failbit, из-за них остальные ф-ции чтения/записи игнорируются. Можете добавить
Код:
file.clear();
это очистит флаг ошибки и всё будет работать как и ожидалось..
netrino вне форума Ответить с цитированием
Старый 29.12.2009, 21:04   #10
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от netrino Посмотреть сообщение
Посмотрел, вот строчки, провоцирующие подобное поведение:
Код:
	if(!file.eof())
	{
		file.read(reinterpret_cast<char*>(&number),sizeof(number));
	}
Дело в том, что при создании файла все флаги у него чисты, но как-только Вы пытаетесь прочитать что-либо, то тут же натыкаетесь на конец файла и выставляются флаги eof и failbit, из-за них остальные ф-ции чтения/записи игнорируются. Можете добавить
Код:
file.clear();
это очистит флаг ошибки и всё будет работать как и ожидалось..
Но с другой стороны у него файл либо пустой, либо там кол-во структур и дальше сами структуры, так что поидее за read не может идти eof...
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать отдельный поток для отправки письма betirsolt Работа с сетью в Delphi 2 28.12.2009 22:39
Как в VS 2008 создать поток? MaxDDT Общие вопросы C/C++ 0 11.12.2009 21:53
OpenDialog и файловый поток. (*_*) Общие вопросы C/C++ 1 03.06.2009 22:44
Создать RSS поток с помощью Web Service damned20 PHP 1 22.05.2009 13:39