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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2022, 18:33   #1
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
Восклицание Очень сильно нужно добавить обработку исключений в код на С++

У меня есть код на С++,
Код:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <ctime>
#include <errno.h>
using namespace std;
//Объявление типа employee
struct employee
{
	char surname[20];
	char name[20];
	char patronymic[20];
	char position[20];
	char start_date[11];
	float salary;
};
//Добавление одной записи в бинарный файл. Параметры – указатель на файл и имя файла
void add_record(char* name)
{
	employee z; FILE* f;
	//Открыть файл и проверить успешность открытия
	errno_t err;
	if ((err = fopen_s(&f, name, "ab")) != 0)
		printf("File not open.\n");
	//Считать запись с клавиатуры (данные вводятся в строку через табуляцию)
	scanf_s("%s\t%s\t%s\t%s\t%s\t%f", z.surname, 20, z.name, 20, z.patronymic, 20,
		z.position, 20,
		z.start_date, 11, &z.salary);
	//Записать запись в файл
	fwrite(&z, sizeof(employee), 1, f);
	//закрыть файл
	fclose(f);
}
//Просмотр файла. Параметры – указатель на файл и имя файла
void view_file(char* name)
{
	employee z; FILE* f;
	errno_t err;
	if ((err = fopen_s(&f, name, "rb")) != 0)
		printf("File not open.\n");
	cout << "\nView file" << endl;
		cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	//Считывать последовательно записи из файла, пока они не закончатся
	while (fread(&z, sizeof(employee), 1, f))
	{
		//Вывести запись на экран в строку через табуляцию
		printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n", z.surname, z.name, z.patronymic,
			z.position, z.start_date, z.salary);
	}
	fclose(f);
}

//Второй способ определения количества записей в файле.
//Параметры – указатель на файл и имя файла. Результат – целое число (количество записей)
int number_of_records2(char* name)
{
	int n = 0; employee z; FILE* f;
	errno_t err;
	if ((err = fopen_s(&f, name, "rb")) != 0)
		printf("File not open.\n");
	//Считывать по очереди все записи и увеличивать счётчик на 1
	while (fread(&z, sizeof(z), 1, f))
		n++;
	fclose(f);
	return n;
}
//Заполнение (создание) массива из бинарного файла.
//Параметры – массив, указатель на файл, имя файла.
void create_array(employee* a, int kol, char* name)
{
	FILE* f;
	errno_t err;
	if ((err = fopen_s(&f, name, "rb")) != 0)
		printf("File not open.\n");
	//Считать kol записей из файла в массив а одной командой
	fread(a, sizeof(employee), kol, f);
	fclose(f);
}
//Сортировка массива
void sort_array(employee* a, int kol)
{
	int i; employee x; bool f;
	//Цикл пока массив не отсортирован. Признаком того, что массив уже отсортирован будет
	//значение переменной f, равное 0, после очередного прохода по массиву
	for (int i = 0; i < kol; ++i) {
		int f = i;
		for (int j = i + 1l; j < kol; ++j)
			if (a[f].salary > a[j].salary) // или (a[f].salary < a[j].salary) для сортировки по убыванию.
				f = j;
		if (f != i) {
			x = a[i]; a[i] = a[f]; a[f] = x;
		}
	}
}
//Вывод динамического массива на экран
void view_array(employee* a, int kol)
{
	cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	for (int i = 0; i < kol; i++)
		printf("%s\t%s\t%s\t%s\t%s\t%10.2f\n", a[i].surname, a[i].name, a[i].patronymic,
			a[i].position, a[i].start_date, a[i].salary);
}
//Создание бинарного файла из динамического массива (возвращение данных в файл)
void array_to_file(employee* a, int kol, char* name)
{
	FILE* f;
	errno_t err;
	if ((err = fopen_s(&f, name, "wb")) != 0)
		printf("File not open.\n");
	fwrite(a, sizeof(employee), kol, f);
	fclose(f);
}
//Вывод данных по условию
void select_data(char* name)
{
	employee z; FILE* f;
	
	errno_t err;
	if ((err = fopen_s(&f, name, "rb")) != 0)
		printf("File not open.\n");
	cout << "\nSelect records" << endl;
	cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	while (fread(&z, sizeof(employee), 1, f))
	{
		
		//Если  должность - «инженер»
		if ( strcmp(z.position, "gogogogo") == 0)
			//Выводим запись на экран
			printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n", z.surname, z.name, z.patronymic,
				z.position,
				z.start_date, z.salary);
	}
	fclose(f);
}
//Создание текстового файла

void create_text_file(char* bname, char* tname)
{
	employee z; float sum = 0, avg; FILE* fb; FILE* ft;
	int k = number_of_records2(bname);
	//Открываем бинарный файл для чтения
	errno_t err;
	if ((err = fopen_s(&fb, bname, "rb")) != 0)
		printf("File not open.\n");
	//Проходим по бинарному файлу и считаем суммарную зарплату
	
	fseek(fb, 0, 0);
	//Открываем текстовый файл для записи
	if ((err = fopen_s(&ft, tname, "wt")) != 0)
		printf("File not open.\n");
	//Идём по бинарному файлу и считываем записи
	while (fread(&z, sizeof(employee), 1, fb))
	{
		//Если запплата ниже средней, то вставляем запись в текстовый файл
		if (strcmp(z.position, "gogogogo") == 0)
			fprintf(ft, "%s\t%s\t%s\t%s\t%s\t%g\n", z.surname, z.name, z.patronymic,
				z.position, z.start_date, z.salary);
	}
	fclose(ft); fclose(fb);
}
//Просмотр текстового файла
void view_text_file(char* name)
{
	employee z; FILE* f;
	errno_t err;
	if ((err = fopen_s(&f, name, "rt")) != 0)
		printf("File not open.\n");
	cout << "\nView text file" << endl;
	cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	while (!feof(f))
	{
		fscanf_s(f, "%s\t%s\t%s\t%s\t%s\t%f\n", z.surname, 20, z.name, 20, z.patronymic, 20,
			z.position, 20,
			z.start_date, 11, &z.salary);
		printf("%s\t%s\t%s\t%s\t%s\t%6.2f\n", z.surname, z.name, z.patronymic,
			z.position, z.start_date, z.salary);
	}
	fclose(f);
}
//Главная функция
int main()
{
	char name[] = "kursfile.txt";
	char tname[] = "textfile.txt"; //имена файлов
	//Ввод данных в бинарный файл
	cout << "Input information about employee:" << endl;
	cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	for (int i = 0; i < 3; i++)
		add_record(name);
	//Вывод файла на экран
	view_file(name);
	//Определение количества записей в файле
	int kol = number_of_records2(name);
	cout << "Number of records in the file: " << kol << endl;
	//cout<<"Number of records in the file: "<<number_of_records2(name)<<endl;

		//Объявление динамического массива
		employee * a = new employee[kol];
	//Заполнение динамического массива значениями
	create_array(a, kol, name);
	//Вывод динамического массива на экран
	cout <<

		"Array:" << endl;
	view_array (a, kol);
	//Сортировка массива
	sort_array(a, kol);
	//Вывод динамического массива на экран
	cout <<"\nSorted array:"<<endl;

	view_array (a, kol);

	//Возвращение отсортированных данных в бинарный файл
	array_to_file(a, kol, name);
	//Очистка памяти из-под массива

		delete[]a;
	//Вывод файла на экран
	view_file(name);
	//Вывод данных из фала на экран по условию
	select_data(name);
	//Создание текстового файла из бинарного
	create_text_file(name, tname);
	//Вывод содержимого теекстового
	view_text_file(tname);
	system("pause");
	return 0;
}
_______________и в эту функцию нужно добавить простенькую обработку исключений з применением try, catch или throw _____________________

Код:
//Добавление одной записи в бинарный файл. Параметры – указатель на файл и имя файла
void add_record(char* name)
{
	employee z; FILE* f;
	//Открыть файл и проверить успешность открытия
	errno_t err;
	if ((err = fopen_s(&f, name, "ab")) != 0)
		printf("File not open.\n");
	//Считать запись с клавиатуры (данные вводятся в строку через табуляцию)
	scanf_s("%s\t%s\t%s\t%s\t%s\t%f", z.surname, 20, z.name, 20, z.patronymic, 20,
		z.position, 20,
		z.start_date, 11, &z.salary);
	//Записать запись в файл
	fwrite(&z, sizeof(employee), 1, f);
	//закрыть файл
	fclose(f);
}
Например если я ввожу z.surname нулевое значение то срабатывало исключение з применением try, catch или throw.

Буду очень благодарен)) нужно для курсовой работы прям очень нужно.

Последний раз редактировалось MaxBrat; 19.11.2022 в 03:30.
MaxBrat вне форума Ответить с цитированием
Старый 18.11.2022, 21:59   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от MaxBrat Посмотреть сообщение
здать
Ох, беда, беда...
waleri вне форума Ответить с цитированием
Старый 19.11.2022, 02:29   #3
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ох, беда, беда...
Это можно подправить а вот как з кодом быть я не понимаю как сюда обработку исключений вставить.
MaxBrat вне форума Ответить с цитированием
Старый 20.11.2022, 17:17   #4
AWPoint
 
Регистрация: 17.11.2022
Сообщений: 9
По умолчанию

Товарищ, не плодите одинаковых тем! throw/try-catch в помощь, уже отвечал. И если вы настолько не понимаете программирование на плюсах, то зачем вообще пошли туда учиться... Да и вообще по обработке исключений куча гайдов на Ютюбе, да и на Хабре есть
AWPoint вне форума Ответить с цитированием
Старый 20.11.2022, 17:26   #5
AWPoint
 
Регистрация: 17.11.2022
Сообщений: 9
По умолчанию

Код:
void add_record(char* name)
{
	employee z; FILE* f;
	//Открыть файл и проверить успешность открытия
	errno_t err;
	if ((err = fopen_s(&f, name, "ab")) != 0)
		//printf("File not open.\n");
                throw new exception ("file not open");
	//Считать запись с клавиатуры (данные вводятся в строку через табуляцию)
	scanf_s("%s\t%s\t%s\t%s\t%s\t%f", z.surname, 20, z.name, 20, z.patronymic, 20,
		z.position, 20,
		z.start_date, 11, &z.salary);
	//Записать запись в файл
	fwrite(&z, sizeof(employee), 1, f);
	//закрыть файл
	fclose(f);
}
Код:
int main()
{
try {
	char name[] = "kursfile.txt";
	char tname[] = "textfile.txt"; //имена файлов
	//Ввод данных в бинарный файл
	cout << "Input information about employee:" << endl;
	cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	for (int i = 0; i < 3; i++)
		add_record(name);
	//Вывод файла на экран
	view_file(name);
	//Определение количества записей в файле
	int kol = number_of_records2(name);
	cout << "Number of records in the file: " << kol << endl;
	//cout<<"Number of records in the file: "<<number_of_records2(name)<<endl;

		//Объявление динамического массива
		employee * a = new employee[kol];
	//Заполнение динамического массива значениями
	create_array(a, kol, name);
	//Вывод динамического массива на экран
	cout <<

		"Array:" << endl;
	view_array (a, kol);
	//Сортировка массива
	sort_array(a, kol);
	//Вывод динамического массива на экран
	cout <<"\nSorted array:"<<endl;

	view_array (a, kol);

	//Возвращение отсортированных данных в бинарный файл
	array_to_file(a, kol, name);
	//Очистка памяти из-под массива

		delete[]a;
	//Вывод файла на экран
	view_file(name);
	//Вывод данных из фала на экран по условию
	select_data(name);
	//Создание текстового файла из бинарного
	create_text_file(name, tname);
	//Вывод содержимого теекстового
	view_text_file(tname);
	system("pause");
} catch(exception& e)
{
cout << e.what << endl;
}
	return 0;
}
Чтобы точно вопросов не было
AWPoint вне форума Ответить с цитированием
Старый 21.11.2022, 08:51   #6
MaxBrat
Пользователь
 
Регистрация: 27.09.2022
Сообщений: 32
По умолчанию

Цитата:
Сообщение от AWPoint Посмотреть сообщение
Код:
void add_record(char* name)
{
	employee z; FILE* f;
	//Открыть файл и проверить успешность открытия
	errno_t err;
	if ((err = fopen_s(&f, name, "ab")) != 0)
		//printf("File not open.\n");
                throw new exception ("file not open");
	//Считать запись с клавиатуры (данные вводятся в строку через табуляцию)
	scanf_s("%s\t%s\t%s\t%s\t%s\t%f", z.surname, 20, z.name, 20, z.patronymic, 20,
		z.position, 20,
		z.start_date, 11, &z.salary);
	//Записать запись в файл
	fwrite(&z, sizeof(employee), 1, f);
	//закрыть файл
	fclose(f);
}
Код:
int main()
{
try {
	char name[] = "kursfile.txt";
	char tname[] = "textfile.txt"; //имена файлов
	//Ввод данных в бинарный файл
	cout << "Input information about employee:" << endl;
	cout << "Surname\tName\tPatronymic\tPosition\tStart date\tSalary\n" << endl;
	for (int i = 0; i < 3; i++)
		add_record(name);
	//Вывод файла на экран
	view_file(name);
	//Определение количества записей в файле
	int kol = number_of_records2(name);
	cout << "Number of records in the file: " << kol << endl;
	//cout<<"Number of records in the file: "<<number_of_records2(name)<<endl;

		//Объявление динамического массива
		employee * a = new employee[kol];
	//Заполнение динамического массива значениями
	create_array(a, kol, name);
	//Вывод динамического массива на экран
	cout <<

		"Array:" << endl;
	view_array (a, kol);
	//Сортировка массива
	sort_array(a, kol);
	//Вывод динамического массива на экран
	cout <<"\nSorted array:"<<endl;

	view_array (a, kol);

	//Возвращение отсортированных данных в бинарный файл
	array_to_file(a, kol, name);
	//Очистка памяти из-под массива

		delete[]a;
	//Вывод файла на экран
	view_file(name);
	//Вывод данных из фала на экран по условию
	select_data(name);
	//Создание текстового файла из бинарного
	create_text_file(name, tname);
	//Вывод содержимого теекстового
	view_text_file(tname);
	system("pause");
} catch(exception& e)
{
cout << e.what << endl;
}
	return 0;
}
Чтобы точно вопросов не было
Это он будет реагировать если невозможно открыть файл?
MaxBrat вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно очень срочно добавить исключение в код на C++ MaxBrat Помощь студентам 1 19.11.2022 08:32
греется видеокарта очень сильно и очень быстро, tokloo Компьютерное железо 1 28.05.2011 11:39
Записи нужно очень сильно. brunetk0 Паскаль, Turbo Pascal, PascalABC.NET 3 22.05.2010 17:52
Вопрос про обработку исключений Ok-ei Общие вопросы C/C++ 17 19.08.2009 22:49