Консультация № 199791
06.12.2020, 22:56
0.00 руб.
0 1 0
Здравствуйте, эксперты! Прошу помощи в следующем вопросе: не могу понять в чем ошибка. Есть, конечно, вариант, что проблема в присвоении новой структуре старой.
Проблема в методе Fread().
Нужно, чтобы записывались данные в первый файл и выводились по нужному месяцу + выявлялся TABN с макс.SOVER, считались итоги.
Можно, если не трудно - с пояснениями. Спасибо!
ТЗ: вывести данные по введенному месяцу, выявить TABN с макс.SOVER, считались итоги.
Код:
#pragma hdrstop
#pragma argsused

#pragma hdrstop
#pragma argsused

# include <stdio.h> //?
# include <conio.h> //?
# include <stdlib.h> //?

#include <iostream>
#include <string>
#include <fstream>
#include <Windows.h>

using namespace std;

# define NT 4 //кол-во записей по-умолчанию в структуре

//int Fsosd(FILE * Ff, int N);
struct ztab
{
int TABN, month; //табельный номер, месяц
float STIME, SBJ, SOVER, SUD, VNR;
};
class Ffile
{
private:
int N; //кол-во записей
ztab tab;
//ztab buf; //структура иницилизация?
char FileName[80];
// char namefilebuf[80];
FILE* Ftab;
// FILE* Fbuf;//указатель на поток
float I_STIME, I_SBJ, I_SOVER, I_SUD, I_VNR; //итоги повременно, сдельно, сверхурочно, удержано, на руки
public:

Ffile(int Nf = NT); //конструтор класса
int Fsosd(); //создание файла
int Fread(); //чтение файла
int FObr(); //обработка
//int Fvedomost();
};

int main()
{
int n; //номер в меню
int pr, rp; //переменная для создания файла
SetConsoleCP(1251);
SetConsoleOutputCP(1251); // для кириллицы в консоли
Ffile x; //создаем объект класса x (вызывается конструктор)
while (1)
{
while (1)
{
system("cls");
cout << "Выберите действие: " << endl
<< "(1) Ввод данных" << endl
<< "(2) Вывод всего файла" << endl
<< "(3) Вывод ведомости по месяцу" << endl
<< "(4) Выход из программы" << endl
<< "Вы выбрали: ";
cin >> n;


if (n >= 1 && n <= 4)
break;
cout << "\nОшибка в номере!! Повторите ввод!" << endl;
system("pause"); //задержка консоли
}//конец внутреннего цикла while (1)
if (n == 4)
{
cout << "\n ПРОЩАЙТЕ!! " << endl;
break;
}

switch (n)
{
case 1:

pr = x.Fsosd();
if (pr == 0) cout << "Файл не создан!" << endl;
break;

case 2: pr = x.FObr();
system("pause"); //задержка консоли
if (pr == 0) {
cout << "Файл не открыт!" << endl;
cout << " Прощайте!" << endl;
system("pause"); //задержка консоли
}
break;


case 3:
pr = x.Fread();
// rp=x.Fvedomost();
system("pause"); //задержка консоли
if (pr == 0 && rp == 0) {
cout << "Файл не открыт!" << endl;
cout << " Прощайте!" << endl;
system("pause"); //задержка консоли
}


}// конец switch(n)
}//конец внешнего цикла while(1)
}
Ffile::Ffile(int Nf)
{
cout << "FileName=" << endl;
cin >> FileName;
//cout << "namefilebuf=" << endl;
//cin >> namefilebuf;

N = Nf;
}
int Ffile::Fsosd()
{
Ftab = fopen(FileName, "wb");
if (Ftab == NULL)
{
perror("Ошибка при открытии потока для файла ");
puts(FileName);
system("pause"); //задержка консоли
return 0;
}
cout << "УРА!! Поток открыт, начинайте ввод!!" << endl;
system("cls");
int i;
for (i = 0; i < N; i++)
{

cout << "Таб. номер = " << endl;
cin >> tab.TABN;
cout << "Месяц= " << endl;
cin >> tab.month ;
cout << "Повременная сумма = " << endl;
cin >> tab.STIME;
cout << "Сдельная сумма = " << endl;
cin >> tab.SBJ;
cout << "Сверхурочная сумма = " << endl;
cin >> tab.SOVER;
cout << "Удержано = " << endl;
cin >> tab.SUD;
tab.VNR = (tab.STIME+ tab.SBJ+ tab.SOVER) - tab.SUD;

fwrite(&tab, sizeof(tab), 1, Ftab);

}
fclose(Ftab);
cout << " Поток закрыт. Файл сохранили! Прощайте" << endl;
system("pause"); //задержка консоли
return 1;
}


int Ffile::Fread()
{
Ftab = fopen(FileName, "rb");
puts(FileName);
if (Ftab == NULL)
{
perror("Ошибка при открытии потока для файла FileName ");
puts(FileName);
system("pause"); //задержка консоли
return 0;

}
//ztab buf = new ztab;
//open new file
FILE* Fbuf;
char namefilebuf[80];
cout << "namefilebuf=" << endl;
cin >> namefilebuf;

ztab buf;

int nMes;
int nMaxMes = 12;
// int _actions; //действия в меню
I_STIME = 0;
I_SBJ = 0;
I_SOVER = 0;
I_SUD = 0;
I_VNR = 0;
float bufmax = 0;
int maxTBN;

Fbuf = fopen(namefilebuf, "wb+");
puts(namefilebuf);
if (Fbuf == NULL)
{
perror("Ошибка при открытии потока для файла FileName ");
puts(FileName);
system("pause"); //задержка консоли
return 0;

}
cout << "Введите номер нужного месяца (от 1 до " << nMaxMes << "): ";
cin >> nMes;



if (nMes >= 0 && nMes <= nMaxMes) { //проверка правильнов введенного номера
int q = 0;
for (int i = 0; i <= N; i++) { //перезаписываем данные из d в buf , ИТАК ходим по всем элементам d
if (tab.month == nMes) { //если это тот элемент, то мы его сохраняем в buf
buf=tab; //ПРОБЛЕМА СКОРЕЕ ВСЕГО ТУТ
q++; //изначально q = 0
fwrite(&buf, sizeof(buf), 1, Fbuf);
}

}


for (int z = 0; z < q; z++) {
I_STIME += buf.STIME;
I_SBJ += buf.SBJ;
I_SOVER += buf.SOVER;
I_SUD += buf.SUD;
I_VNR += buf.VNR;
}

//поиск максимальных сверхурочных по месяцу
for (int j = 0; j <= q; j++)
{
if (buf.SOVER > bufmax)
bufmax = buf.SOVER;
maxTBN = buf.TABN;

}

if (Ftab == NULL)
{
perror("Ошибка при открытии потока для файла ");
puts(FileName);
system("pause"); //задержка консоли
return 0;
}
cout << "Расчетная ведомоcть за " << nMes << "месяц.\n";
cout << "Таб. ном.|" << "С. поврем.|" << "С. сдельн.|" << "Сверхур.|" << "С.Удержаний|" << "С. к выдаче" << endl;


while (fread(&buf, sizeof(buf), 1, Fbuf))//чтение очередной эаписи файла
{ // сюда мы попадем, если не прочтем 0 байт(если файл не исчерпан!!!)

cout << buf.TABN << "| " << buf.STIME << "| " << buf.SBJ << "| " << buf.SOVER << "| " << buf.SUD << "| " << buf.VNR << endl;
cout << "_______________________________________________________________\n";
}
system("cls");




}
fclose(Fbuf);
fclose(Ftab);
}
/*
int Ffile::Fvedomost(){
Fbuf = fopen(namefilebuf, "rb");
puts(namefilebuf);
if (Ftab == NULL)
{ perror ("Ошибка при открытии потока для файла FileName ");
puts(namefilebuf);
system("pause");
return 0;

}

cout << "Расчетная ведомоcть за " << nMes << "месяц.\n";
cout << "Таб. ном.|" << "С. поврем.|" << "С. сдельн.|" << "Сверхур.|" << "С.Удержаний|" << "С. к выдаче" << endl;


while (fread(&buf, sizeof(buf), 1, Fbuf))//чтение очередной эаписи файла
{ // сюда мы попадем, если не прочтем 0 байт(если файл не исчерпан!!!)

cout << buf.TABN << "| " << buf.STIME << "| " << buf.SBJ << "| " << buf.SOVER << "| " << buf.SUD << "| " << buf.VNR << endl;
cout << "_______________________________________________________________\n";
}
fclose(Fbuf);

return 1;
} */

int Ffile::FObr()
{ // puts(FileName);
Ftab = fopen (FileName, "rb");
puts(FileName);
if (Ftab == NULL)
{ perror ("Ошибка при открытии потока для файла FileName ");
puts(FileName);
system("pause");
return 0;

}

cout << "\n\n записаный файл \n "<< endl;
cout << "Таб. ном.|" << "С. поврем.|" << "С. сдельн.|" << "Сверхур.|" << "С.Удержаний|" << "С. к выдаче" << endl;
printf("=================================================\n");

while (fread(&tab, sizeof(tab), 1, Ftab))//чтение очередной эаписи файла
{ // сюда мы попадем, если не прочтем 0 байт(если файл не исчерпан!!!)

cout << tab.TABN << "| " << tab.STIME << "| " << tab.SBJ << "| " << tab.SOVER << "| " << tab.SUD << "| " << tab.VNR << endl;
cout << "_______________________________________________________________\n";
}
fclose (Ftab);
return 1;
}


(Builder 10.3)

Обсуждение

давно
Посетитель
403344
3
10.12.2020, 16:34
общий
решил
Форма ответа