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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2017, 17:52   #1
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию Файловый ввод-вывод. Ввёл несколько фамилий например 2 (с возрастом соответственно), а он мне выдаёт, что в файле 80 человек.

Здравствуйте!
Помогите пожалуйста найти ошибку. В программе вводятся фамилии без пробелов и возраст.
Ввёл несколько фамилий например 2 (с возрастом соответственно), а он мне выдаёт, что в файле 80 человек.
В чем дело?
Код:
#include<fstream>
#include<iostream>
#include<conio.h>
using namespace std;
//////////////////////////////////////////////
class person
{
protected:
	char name[40];
	int age;
public:
	void getData(void)
	{
		cout<<"\nВведите фамилию: "; 
		cin>>name;
		cout<<"\nВведите возраст: ";
		cin>>age;
	}
	void showData(void)
	{
		cout<<"\nИмя: "<<name;
		cout<<"\nВозраст: "<<age;
	}
	void diskIn(int);
	void diskOut();
	static int diskCount();
	};
	//----------------------------------------
	void person::diskIn(int pn)
	{
		ifstream infile;
		infile.open("PERSFILE.DAT",ios::binary);
		infile.seekg(pn*sizeof(person));
		infile.read((char*)this, sizeof(*this));
	}
	//----------------------------------------
	void person::diskOut()
	{
		ofstream outfile;
		outfile.open("PERSFILE.DAT", ios::app | ios::binary);
		outfile.write((char*)this, sizeof(*this));
	}
	//----------------------------------------
	int person::diskCount()
	{
		ifstream infile;
		infile.open("PERSFILE.DAT", ios::binary);
		infile.seekg(0, ios::end);
		return (int)infile.tellg();
	}
	int main()
	{
		setlocale(LC_ALL,"rus");
		person p;
		char ch;
		do
		{
			cout<<"Введите данные о человеке: ";
			p.getData();
			p.diskOut();
			cout<<"\nПродолжить?(y/n)";
			cin>>ch;
		}
		while(ch=='y');
		int n=person::diskCount();
		cout<<"\nВ файле "<<n<<" человек(а).";
		for(int j=0; j<n; j++)
		{
			cout<<"\nПерсона "<<j;
			p.diskIn(j);
			p.showData();
		}
		cout<<endl;
		getch();
		return 0;
	}
Подозреваю что что-то с данными от int person:iskCount(), либо цикл вывода, но опять же он основывается на данных от int person:iskCount().....
KAMLS вне форума Ответить с цитированием
Старый 27.07.2017, 18:13   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Ну так вы записали два объекта, т.е. 88 байт. Потом читаете и спрашиваете сколько байт - вам говорят 88... только вы почему-то их интерпретируете, как вам вздумается.
p51x вне форума Ответить с цитированием
Старый 27.07.2017, 19:10   #3
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Да нет, вы программу то запустите, посмотрите. Он должен выдать количество человек, количество персон.
например, два человека, две фамилии и два возраста, Программа должна их показать по номерам персон с фамилиями и возрастом.
А там черт-те что...
KAMLS вне форума Ответить с цитированием
Старый 27.07.2017, 19:34   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Код:
int person::diskCount()
	{
		ifstream infile;
		infile.open("PERSFILE.DAT", ios::binary); // открываем файл как бинарный
		infile.seekg(0, ios::end);//переход в конец файла
		return (int)infile.tellg(); // возвращаем текущую позицию в файле, т.е. количество байт в файле.
	}
где тут подсчёт числа фамилий или возрастов или чего-то еще?
pu4koff вне форума Ответить с цитированием
Старый 27.07.2017, 19:38   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
Да нет, вы программу то запустите, посмотрите.
Лучше вы документацию по fstream откройте и посмотрите что делает tellg.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 27.07.2017, 19:44   #6
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Дико извиняюсь, не добавил вычисление
return (int)infile.tellg()/sizeof(person);
но один хрен та же хрень
Он по объектам должен вычислить количество и передать в цикл число в переменной n
KAMLS вне форума Ответить с цитированием
Старый 28.07.2017, 10:06   #7
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Всё, сделал. Всем спасибо.
KAMLS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файловый ввод/вывод в языке С: Организовать текстовый файл f, состоящий из N строк. Организовать замену слов в файле. Анастасия_А Помощь студентам 3 28.03.2016 14:32
Файловый ввод\вывод ВаликАматор Общие вопросы C/C++ 0 27.02.2011 11:08
Файловый ввод-вывод Кристюня Общие вопросы C/C++ 9 29.11.2010 20:02
Файловый ввод-вывод Оля_1991 Помощь студентам 0 10.10.2010 14:12
Файловый ввод вывод GrihaI Общие вопросы C/C++ 4 31.05.2010 02:45