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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2012, 02:32   #1
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию Флаг eof

Проблемма такова..
В файл я заранее записал 5 структур.
Теперь я их "оттуда" достаю.

определение структуры
Код:
const int MAX = 100;
struct base{
	short int ID;
	short int year;
	char author[MAX];
	char title[MAX];
	int pages;
	int price;
	base(){
		ID=0; year=0;
		author[0]='\0';
		title[0]='\0';
		pages=0; price=0;
	} 
} book[MAX];
"достаю" вот так:
Код:
int loadProgramm(){
	system("cls");
	ifstream load("E://baseBook.dat", ios::binary);
	if(!load){
		cerr << "Error - can't open file" << endl;
		return false;
	}

	for(i = 0; !load.eof(); i++){
		load.read(reinterpret_cast<char*>(&book[i]), sizeof(base));
		showInfo(i); //просто выводит структуру на экран
	}
	cout << "You have " << i << " records in your base" << endl;
	load.close();
	return true;
}
проблема в том, что выводит на экран всегда на 1 структурный объект больше, чем находится в файле. в данном случае в файле их 5. их выводит он верно. но после последнего структурного объекта, который находится в файле, он выводит еще и объект, проиницилизированный нулями. откуда он берется не пойму.

p.s. тему наверно не совсем корректно назвал
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 24.10.2012, 03:10   #2
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Так..создал файл baseBook.dat. Он "голый". Но функция loadProgramm() все равно выводит структурный объект(проинициализированный конструктором). Вопрос: почему?
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 24.10.2012, 05:38   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,770
По умолчанию

Флаг еоф установится только после первого неудачного чтения за пределами файла.
p51x вне форума Ответить с цитированием
Старый 24.10.2012, 12:52   #4
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Подозрения на это были. И как быть в такой ситуации? Была мысль проверять значения, которые считываются...но думаю это неверно. Если изначально пользователь к примеру сам ввел 0 и пусты строки - тогда будут уже другие ошибки(файл неверно будет подгружаться). Какие способы есть?
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Старый 24.10.2012, 13:21   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я к сожалению не знаю C/C++
но, надеюсь, что библиотеки должны иметь схожие свойства и методы.

попробуйте так:
Код:
	for(i = 0; load.count(); i++){
		load.read(reinterpret_cast<char*>(&book[i]), sizeof(base));
		showInfo(i); //просто выводит структуру на экран
	}

// как вариант:
	for(i = 0; load.size(); i++){

сходил в поиск (погулил чутка...).
вот ТУТ
такое предлагают:
Код:
    static int count()
    {
        ifstream file;
        file.open("Persona1204.dat",ios::binary);
        file.seekg(0,ios::end);
        return (int)(file.tellg()/sizeof(Persona));
    }
btw, и там же ещё несколько примеров решений аналогичной задачи есть..

Последний раз редактировалось Serge_Bliznykov; 24.10.2012 в 13:29.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 24.10.2012, 13:34   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Попробуйте зделать вот так.
Код:
int i=0;
while(!load.eof())
{
  load.read(reinterpret_cast<char*>(&book[i]), sizeof(base));
  showInfo(i); //просто выводит структуру на экран
i++;
}
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 24.10.2012, 18:35   #7
ArmanPrestige
Главное желание.
Форумчанин
 
Регистрация: 28.11.2011
Сообщений: 122
По умолчанию

Код:
static int count()
    {
        ifstream file;
        file.open("Persona1204.dat",ios::binary);
        file.seekg(0,ios::end);
        return (int)(file.tellg()/sizeof(Persona));
    }
Помогло. Спасибо
Я могу, Я хочу, Я буду!
ArmanPrestige вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
флаг TF goluzov Помощь студентам 0 14.04.2012 03:24
Светофор и флаг танкек Паскаль, Turbo Pascal, PascalABC.NET 13 14.12.2011 09:31
Флаг Монако Amursk55 Помощь студентам 0 17.10.2011 16:16
Внутрибиблиотечный мьютекс или флаг. Alex Cones Общие вопросы Delphi 5 02.02.2011 21:24
Нарисовать флаг РФ (C++) NoiseEP Помощь студентам 5 15.03.2009 10:21