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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2013, 12:45   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Правильность кода

Добрый день. Сейчас по книжке прохожу запись объектов в файл. В книге приведен пример с использованием write() и read(). Я решил немного переделать и хочу спросить, является ли этот код эффективным.
И еще вопрос по поводу среды разработки. Наверное многим сейчас известно, что появилась студия 2013. Так вот хотелось бы спросить имеет ли смысл ее использовать (до этого использовал 2010). Просто зная майкрософт, не очень удивлюсь, если студия пока еще кривая.


Код:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <Windows.h>

using namespace std;

class Person
{
private:
	string name;
	int age;
public:
	void getData();
	string getName() { return name; } //Функция доступа
	int getAge() { return age; } //Функция доступа
	friend ofstream &operator<<(ofstream &, Person &); // Перегружаем оператор вывода в поток
};

void Person::getData()
{
	cout << "Введите имя: ";
	cin >> setw(64) >> name;
	while (1)
	{
		cout << "Введите возраст: ";
		cin >> age;
		if (cin.good())
		{
			cin.ignore(16, '\n');
			break;
		}
		cin.ignore(16, '\n');
		cout << "Неверное значение. " << endl;
		cin.clear();
	}
}

ofstream &operator<<(ofstream &stream, Person &obj)
{
	stream << obj.name;
	stream << obj.age;
	return stream;
}

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	char ch;
	Person pers;
	pers.getData();
	ofstream out("opers.txt", ios::binary);
	if (!out)
	{
		cout << "Не могу открыть файл. " << endl;
		system("pause");
		return 1;
	}
	out << "Имя: " << pers.getName() << endl;
	out << "Возраст: " << pers.getAge() << endl;
	out.close();
	ifstream in("opers.txt", ios::binary);
	if (!in)
	{
		cout << "Не могу открыть файл. " << endl;
		system("pause");
		return 1;
	}
	while (in)
	{
		in.get(ch);
		cout << ch;
	}
	system("pause");
	return 0;
}

Последний раз редактировалось Dima-War; 14.07.2013 в 12:50.
Dima-War вне форума Ответить с цитированием
Старый 14.07.2013, 13:10   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Поставьте VS 2012. Пока смысла 2013 ставить нет.
А IDE от Microsoft никогда кривым небыло.
Igor95 вне форума Ответить с цитированием
Старый 14.07.2013, 15:20   #3
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Ок, а что на счет кода?
Dima-War вне форума Ответить с цитированием
Старый 14.07.2013, 17:35   #4
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Сделал как написано по примеру в учебнике. Программа вроде бы работает корректно, в программе данные отображаются нормально, но в файл сохраняются символы:
찀쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌 쳌쳌쳌 (ввел имя Петр, возраст 12).

Это нормально или у меня все таки есть ошибка?

Код:
#include <iostream>
#include <fstream>
#include <Windows.h>
#include <iomanip>

using namespace std;

class Person
{
private:
	char name[64];
	int age;
public:
	void getData();
	void showData();
};

void Person::getData()
{
	cout << "Введите имя: ";
	cin >> setw(64) >> name;
	while (1)
	{
		cout << "Введите возраст: ";
		cin >> age;
		if (cin.good())
		{
			cin.ignore(16, '\n');
			break;
		}
		cin.clear();
		cout << "Неверное значение. " << endl;
                cin.ignore(16, '\n');
	}
}

void Person::showData()
{
	cout << "Имя: " << name << endl;
	cout << "Возраст: " << age << endl;
}

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	Person pers;
	char answer;
	ofstream out("opers2.txt", ios::binary);
	if (!out)
	{
		cout << "Can't open file. " << endl;
		system("pause");
		return 1;
	}
	do
	{
		pers.getData();
		out.write((char *) &pers, sizeof pers);
		cout << "Продолжить ввод? (y/n)";
		cin >> answer;
	}
	while (answer != 'n');
	out.close();
	ifstream in("opers2.txt", ios::binary);
	if (!in)
	{
		cout << "Can't open file." << endl;
		system("pause");
		return 1;
	}
	in.seekg(0);
	in.read((char *) &pers, sizeof pers);
	while (!in.eof())
	{
		pers.showData();
		in.read((char *) &pers, sizeof pers);
	}
	system("pause");
	return 0;
}

Последний раз редактировалось Dima-War; 14.07.2013 в 17:41.
Dima-War вне форума Ответить с цитированием
Старый 14.07.2013, 18:32   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

узнай что оно отображает
онлайн декодеры говорят что ето текст UTF-8 или UTF-16, раскодированный текст:
Цитата:
первые пункты поиска источник
Hint
оЕРПллллллллллллллллллллллллллллллл лллллллллллллллллллллл лллллл
do not use your brain

Последний раз редактировалось Кащей; 14.07.2013 в 18:40.
Кащей вне форума Ответить с цитированием
Старый 14.07.2013, 18:36   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ТС, вы между символами и просто байтами разницу знаете?
вы сохраняете данные так как они лежат в памяти, не переводя в текст.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2013, 19:24   #7
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ТС, вы между символами и просто байтами разницу знаете?
вы сохраняете данные так как они лежат в памяти, не переводя в текст.
А как можно это исправить? Т.е. переводить данные в текст и потом уже сохранять. Или в этом нет смысла?

Последний раз редактировалось Dima-War; 14.07.2013 в 19:38.
Dima-War вне форума Ответить с цитированием
Старый 14.07.2013, 21:04   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

если например данные человек должен прочесть без вашей программы то имеет смысл пперевести в текст, если только ваша программа может открыть файл, то обычно оставляют бинарные(они меньше весят все же)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.07.2013, 21:18   #9
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
если например данные человек должен прочесть без вашей программы то имеет смысл пперевести в текст, если только ваша программа может открыть файл, то обычно оставляют бинарные(они меньше весят все же)
Понял, спасибо.
Dima-War вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверьте правильность написания кода и коментарии mugik770 Помощь студентам 0 01.09.2012 19:35
правильность кода DeDoK Работа с сетью в Delphi 12 22.11.2009 09:43
Синтаксис и нормы. Правильность кода. Winlook JavaScript, Ajax 0 16.11.2009 16:57
Проверте правильность кода (деревья) Chudo4258 Помощь студентам 0 04.05.2009 21:24
Проверьте правильность написания кода в delphi neomaximus Помощь студентам 2 09.04.2009 17:29