Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Мастер-Эксперт

940

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

427

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

393

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

328

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

169


ID: 400484

solowey

Профессор

66


ID: 165461

Лангваген Сергей Евгеньевич

Советник

64

Россия, Московская обл.


8.1.6

02.01.2021

JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1


 

• С / С++

Создание программ на языках C и C++.

Администратор раздела: Андрей Кузнецов aka Dr_Andrew (Старший модератор)


Коцюрбенко Алексей Владимирович
Статус: Старший модератор
Рейтинг: 2131
Gluck
Статус: 6-й класс
Рейтинг: 290
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 222
 

Перейти к консультации №:
 

Консультация онлайн # 199791
Раздел: • С / С++
Автор вопроса: IvanDorohov (Посетитель)
Дата: 06.12.2020, 22:56
Поступило ответов: 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)

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 199791

IvanDorohov

Посетитель

ID: 403344

1

= общий = |  10.12.2020, 16:34 |  цитировать |  профиль |  личное сообщение

решил

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.