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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2016, 19:55   #1
Daymond8
Новичок
Джуниор
 
Регистрация: 12.01.2016
Сообщений: 2
Восклицание нужен совет по коду

не работает функция открытия файла(void opf)
Код:
#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
using namespace std;
FILE *fl;
typedef struct
{
	char fio[30];
	int hours;
	double cost;
} TEmployee;
TEmployee emp[30];
char name[20];
int nst = 0;
int menu();
void nnf();
void newf();
void spisok();
void opf();
void resc();
void resf();
int main()
{
	setlocale(0, "");
	while (true)
	{
		switch (menu())
		{
		case 1: nnf(); break;
		case 2: newf(); break;
		case 3: spisok(); break;
		case 4: opf(); break;
		case 5: resc(); break;
		case 6: resf(); break;
		case 7: return 0;
		default: cout << "выберете правильно";
		}
		puts("Нажмите любую кнопку для продолжения");
		system("cls");
	}
}
int menu()
{
	cout << "Выберете: " << endl;
	cout << "1.Ввод имени файла" << endl;
	cout << "2.Новый файл" << endl;
	cout << "3.Введите список" << endl;
	cout << "4.Открыть файл" << endl;
	cout << "5.Вывести результат" << endl;
	cout << "6.Вывести в файл" << endl;
	cout << "7.Выход" << endl;
	int i;
	cin >> i;
	return i;
}
void nnf()
{
	cout << "Введите имя файла" << endl;
	cin >> name;
}
void newf()
{
	fl = fopen(name, "wb");
	if (fl == NULL)
	{
		cout << "Ошибка при создании" << endl;
		exit(1);
	}
	cout << "OK" << endl;
	fclose(fl);
}
void spisok()
{
	fl = fopen(name, "rb+");
	if (fl == NULL)
	{
		cout << "Ошибка при создании" << endl;
		exit(1);
	}
	cout << "Введите число работников" << endl;
	cin >> nst;
	for (int i = 0; i < nst; i++)
	{
		cout << "Введите имя: ";
		cin >> emp[i].fio;
		cout << "Введите количество часов: ";
		cin >> emp[i].hours;
		cout << "Введите часовой тариф: ";
		cin >> emp[i].cost;
		fwrite(&emp[i], sizeof(TEmployee), 1, fl);
	}
	fclose(fl);
}
void opf()
{

	fl = fopen(name, "rb");
	if (fl == NULL)
	{
		cout << "Ошибка при открытии" << endl;
		system("pause");
		exit(1);
		
	}
	nst = 0; TEmployee employee;
	while (true)
	{
		int nwrt = fread(&employee, sizeof(TEmployee), 1, fl);
		if (nwrt != 1) break;
		emp[nst] = employee;
		cout << emp[nst].fio << " " << emp[nst].hours << " " << emp[nst].cost << endl;
		nst++;
	}
	fclose(fl);
}

double get_money(int hours, double cost)
{
	if (hours <= 144)
		return (hours * cost) * 0.88;
	else
		return (144 * cost + (hours - 144) * 2 * cost) * 0.88;
}

void resc()
{
	for (int i = 0; i < nst; i++)
		cout << emp[i].fio << " " << get_money(emp[i].hours, emp[i].cost) << endl;
	system("pause");
}
void resf()
{
	char namet[30];
	FILE *ft;
	cout << "Введите имя файла" << endl;
	cin >> namet;
	ft = fopen(namet, "w");
	if (ft == NULL)
	{
		cout << "Ошибка при создании" << endl;
		exit(1);
	}
	char s[80];
	for (int i = 0; i < nst; i++)
	{
		strcpy(s, emp[i].fio);
		strcat(s, " ");
		fputs(s, ft);
		fprintf(ft, "%lf\n", get_money(emp[i].hours, emp[i].cost));
	}
	fclose(ft);
	system("pause");
}
Daymond8 вне форума Ответить с цитированием
Старый 12.01.2016, 20:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ощибку дает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.01.2016, 00:15   #3
Daymond8
Новичок
Джуниор
 
Регистрация: 12.01.2016
Сообщений: 2
По умолчанию

нет, она просто моргает результатом и все, хотя system("pause") прописан
Daymond8 вне форума Ответить с цитированием
Старый 13.01.2016, 04:23   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

А ты паузу перед каждым екзит 1 поставил?
p51x вне форума Ответить с цитированием
Старый 13.01.2016, 05:32   #5
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Убери system("pause"); из функций void resc() и void resf() и поставь перед return в майне.
Функцию system("cls"); нужно ставить перед switch (menu()) так как она служит для очистки экрана.

Код:
int main()
{
	setlocale(0, "");
        bool exit = true;
	while (exit)
	{
                system("cls");
		switch (menu())
		{
		case 1: nnf(); break;
		case 2: newf(); break;
		case 3: spisok(); break;
		case 4: opf(); break;
		case 5: resc(); break;
		case 6: resf(); break;
		case 7: exit = false;
		default: cout << "выберете правильно";
		}
		puts("Нажмите любую кнопку для продолжения");
		system("pause");
	}
        return 0;
}
Перепиши вот так.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 13.01.2016 в 05:43.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен совет lecs86 Свободное общение 3 07.09.2012 07:54
Нужен совет по коду под Windows Granus Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 30.08.2012 22:03
Нужен совет, просто совет kardinal94 Общие вопросы Delphi 7 16.12.2010 22:16
Нужен совет vpersov Общие вопросы Delphi 1 29.11.2010 14:54
Нужен совет Vergiliy БД в Delphi 2 13.01.2009 08:58