1

Тема: Файли. Дати.

Доброго дня. Дійшов до вивчення файлів. Трохи розібрався, щось зрозумів. Здебільшого виходить тільки з текстом. З числами - проблема.
Ось поставлені завдання:
Задано файл, що містить дати. Кожна дата – це число, місяць і рік. Знайти:
1) рік з найменшим номером;
2) всі весняні дати;
3) найближчу дату до сьогоднішньої.

Якщо маєте можливість, підкажіть. З весняними датами ніби все просто. Не знаю як саме все поєднати. На рахунок завдання 3, навіть уявлення не маю.


#include <iostream>
#include <fstream>
#include <iomanip>
#include <Windows.h>
using namespace std;

const char* file = "ch.txt"; //стрічка з іменем файлу
struct date
{
    int day, month, year; //прискорення вільного падіння
};

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int min = 0, p[] = {3,4,5};
    date pl;
    cout << fixed << right;

    //друк вмістимого файлу

    ifstream fin; //створення об'єкту потоку вводу для нового файлу з іменем fin

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open()) //якщо файл відкрито

    {

        cout << "Дати у файлі: "

            << file << " file:\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.day !=0) {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            }//друк даних на екран

        }

        fin.close(); //закриття файлу

    }

    //додавання нових даних до файлу

    ofstream fout(file, ios_base::out | ios_base::app | ios_base::binary);

    //створення об'єкту потоку виводу (доповнення) для двійкового файлу з іменем fout

    if (!fout.is_open()) //якщо файл НЕ відкрито

    {

        cout << "Файл " << file << " не відкривається:\n\n";

        return 1;

    }
 //введення нового імені планети
    cout << "Введіть день: ";
    while (cin >> pl.day)

    {
        while (pl.day < 0 || pl.day > 31) 
        { 
        cout << "Введіть коректну дату: ";
        cin >> pl.day;
        }
            cout << "Введіть місяць: ";

            cin >> pl.month; //введення населення
            while (pl.month < 0 || pl.month > 12)
            {
                cout << "Введіть коректну дату: ";
                cin >> pl.month;
            }

            cout << "Введіть рік: ";

            cin >> pl.year; //введення прискорення
            while (pl.year < 0)
            {
                cout << "Введіть коректну дату: ";
                cin >> pl.year;
            }

            fout.write((char*)&pl, sizeof pl); //запис у файл цілої введеної структури

            cout << "Натисніть будь-яку літеру щоб закінчити:\n";
        
    }

    fout.close(); //закриття файлу

    //друк доповненого файлу


    fin.clear(); //скинути fin (не обов'язково, але не завадить)

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open()) //якщо файл відкрито

    {
        cout << "Обновлений список дат: "

            << file << " file:\n\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.day != 0)
            {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            } //друк даних на екран

        }
        fin.close(); //закриття файлу
    }

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання
    if (fin.is_open()) //якщо файл відкрито
    {
        cout << "Cписок весняних дат: " << file << " file:\n\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.month == p[0] || pl.month == p[1] || pl.month == p[2])
            {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            } //друк даних на екран

        }
        fin.close(); //закриття файлу

    }

    cout << "\nDone.\n";
    return 0;

}

Завчасно дякую.

2

Re: Файли. Дати.

Limon написав:
//прискорення вільного падіння
//введення нового імені планети
//введення населення

От саме тому я й не люблю коментарі. Неправильний коментар - гірше за відсутній.

3

Re: Файли. Дати.

Limon написав:

Здебільшого виходить тільки з текстом. З числами - проблема.

Не бачу, щоб ви щось робили з текстом. Яка проблема з числами - теж лишається питанням, ми тут не телепати.
По пункту 3 - обчислюйте "відстань" (кількість днів між поточною датою і прочитаною), вам потрібна дата з мінімальною "відстанню". Взагалі краще було б вам стандартним типом скористатися.

4

Re: Файли. Дати.

Це типу код з гугл-перекладача напевне чи то з англійської, чи то з китайської :)

5

Re: Файли. Дати.

це було готове завдання накшталт того довідника.

6

Re: Файли. Дати.

З 1 та 2 розібрався, залишилося тільки 3. В 3 потрібно знайти найближчу дату, саме до поточної. Тобто якщо ви будете користуватися цим завтра, то потрібно уже буде ближчу дату до 5 червня  а не до 4.
Ось в чому полягає моя проблема в цілому. Коментар ваш я почитав на рахунок відстані, але не знаю чи тут його можна використати.

Ось повний код:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <ctime>
#pragma warning(disable:4996)
using namespace std;

const char* file = "ch.txt"; //стрічка з іменем файлу
struct date
{
    int day, month, year;
};

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int p[] = {3,4,5};
    date pl;
    cout << fixed << right;

    //друк вмістимого файлу

    ifstream fin; //створення об'єкту потоку вводу для нового файлу з іменем fin

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open()) //якщо файл відкрито

    {

        cout << "Дати у файлі: "

            << file << " file:\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.day !=0) {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            }//друк даних на екран

        }

        fin.close(); //закриття файлу

    }

    //додавання нових даних до файлу

    ofstream fout(file, ios_base::out | ios_base::app | ios_base::binary);

    //створення об'єкту потоку виводу (доповнення) для двійкового файлу з іменем fout

    if (!fout.is_open()) //якщо файл НЕ відкрито

    {

        cout << "Файл " << file << " не відкривається:\n\n";

        return 1;

    }
    cout << "Введіть день чи натисніть будь-яку літеру щоб закінчити: ";
    while (cin >> pl.day)

    {
        while (pl.day < 0 || pl.day > 31) 
        { 
        cout << "Введіть коректну дату: ";
        cin >> pl.day;
        }
            cout << "Введіть місяць: ";

            cin >> pl.month;
            while (pl.month < 0 || pl.month > 12)
            {
                cout << "Введіть коректну дату: ";
                cin >> pl.month;
            }

            cout << "Введіть рік: ";

            cin >> pl.year; 
            while (pl.year < 0)
            {
                cout << "Введіть коректну дату: ";
                cin >> pl.year;
            }

            fout.write((char*)&pl, sizeof pl); //запис у файл цілої введеної структури

            cout << "Введіть день чи натисніть будь-яку літеру щоб закінчити: ";
        
    }

    fout.close(); //закриття файлу

    //друк доповненого файлу


    fin.clear(); 

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())

    {
        cout << "Обновлений список дат: "

            << file << " file:\n\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.day != 0)
            {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            } //друк даних на екран

        }
        cout << endl;
        fin.close(); //закриття файлу
    }
    fin.clear();
    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання
    
    if (fin.is_open())
    {
        cout << "Cписок весняних дат: " << file << " file:\n\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.month == p[0] || pl.month == p[1] || pl.month == p[2])
            {
                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
                //друк даних на екран
            } 
        }
        fin.close(); //закриття файлу
    }
    fin.clear();

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())
    {
        int min = pl.year;
        cout << "\nНайменший рік: " << file << " file:\n\n";
        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl
        {
            if (pl.year < min)
                min = pl.year;
        }
        cout << min << " рік\n\n";
    }
    fin.clear();

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())
    {
        time_t tm = time(NULL);
        cout << "Час в даний момент: " << ctime(&tm) << "\n";
        cout << "Найближча дата до сьогоднішньої: ";
        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl
        {
        }
    }

    cout << "\nDone.\n";
    return 0;

}

Не розумію, що саме тут можна добавити:

if (fin.is_open())
    {
        time_t tm = time(NULL);
        cout << "Час в даний момент: " << ctime(&tm) << "\n";
        cout << "Найближча дата до сьогоднішньої: ";
        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl
        {
        }
    }

7

Re: Файли. Дати.

Алгоритм пошуку найменшого знаєте?
А час між двома подіями можна знайти функцією difftime.

Подякували: Limon, leofun012

8

Re: Файли. Дати.

Переглянув більшість сайтів на рахунок difftime. Виникло питання, як його використати в циклі. Тому що при такому коді

fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())
    {    
        time_t now = time(0);
        tm* ltm = localtime(&now);
        struct tm blr;
        blr = *localtime(&now);
        double timer;
        cout << "Сьогодні: " << endl;
        cout << "Рік: " << 1900 + ltm->tm_year << endl;
        cout << "Місяць: " << 1 + ltm->tm_mon << endl;
        cout << "День: " << ltm->tm_mday << endl;
        cout << "Час: " << ltm->tm_hour << " год ";
        cout << ltm->tm_min << " хв ";
        cout << ltm->tm_sec << " сек " << endl;
        cout << "\nРізниця між датами: ";

        while (fin.read((char*)&pl, sizeof pl))
        {
            blr.tm_year = pl.year - 1900;
            blr.tm_mon = pl.month - 1; 
            blr.tm_mday = pl.day;
            timer =  difftime(now, mktime(&blr));
            cout << timer;
        }

нічого не виводить.(Окрім сьогоднішньої звісно).

9

Re: Файли. Дати.

Взагалі нічого? Дивно. Щонайменше мало б вивестися слово "Сьогодні". Можливо, файлу не існує?

Подякували: leofun011

10

Re: Файли. Дати.

Ось це виводить:

cout << "Сьогодні: " << endl;
        cout << "Рік: " << 1900 + ltm->tm_year << endl;
        cout << "Місяць: " << 1 + ltm->tm_mon << endl;
        cout << "День: " << ltm->tm_mday << endl;
        cout << "Час: " << ltm->tm_hour << " год ";
        cout << ltm->tm_min << " хв ";
        cout << ltm->tm_sec << " сек " << endl;
        cout << "\nРізниця між датами: ";

Не виводить саме цю частину коду:

while (fin.read((char*)&pl, sizeof pl))
        {
            blr.tm_year = pl.year - 1900;
            blr.tm_mon = pl.month - 1; 
            blr.tm_mday = pl.day;
            timer =  difftime(now, mktime(&blr));
            cout << timer;
        }

11

Re: Файли. Дати.

Взагалі правильно застосовувати цикл для такого роду функції?https://replace.org.ua/uploads/images/10171/0457a8424640a1cda82ed134546267e8.png

12

Re: Файли. Дати.

Цикл - це базова структура мови програмування. У вас же не виникають питання "чи правильно застосовувати дієслово в реченні" чи "чи правильно застосовувати літеру л у звороті". Конкретно тут саме цикл і потрібен.

Будь ласка, приділяйте більше уваги деталям. "Цю частину коду" і не має виводити. Має виводити в ній лише число timer, і лише за умови, що дата прочитається. Значить, ця умова і не виконується.
Я б вам радив рознести різні частини по різних функціях. Ви наразі використовуєте одні змінні в різних частинах (зокрема, файл), а це, хоча і не заборонено, може призводити до різних помилок.

Подякували: leofun011

13

Re: Файли. Дати.

Дякую що вказали на проблему. На рахунок того, що виводити має тільки timer я розумію)) Не розумію саме як це виправити. Не могли б Ви приблизно показати,якщо Вам не важко, що маєте на увазі під фразою "рознести різні частини по різних функціях". Можна на прикладі, якщо бажаєте.

14

Re: Файли. Дати.

У вас є кілька блоків коду, які між собою пов'язані виключно через файл. Тобто їм з одного в інший не треба нічого в коді передавати. Відповідно, ці блоки можна запхати в різні функції навіть без параметрів. main може виглядати приблизно так:

void output_all(); //передпроголошення функції. Насправді можна просто перенести сюди всю функцію, але тоді main
                                  //буде в кінці файлу

int main()
{
    output_all();
    update_file();
    cout<<"Оновлені ";
    output_all();
    all_spring_dates();
    smallest_year();
    closest_date();
    // такий код взагалі не потребує коментарів, він і є власним коментарем
}

void output_all()
{
    ifstream fin(file, ios_base::in | ios_base::binary); // створення об'єкту потоку вводу для нового файлу з іменем fin
                                                                            // і одночасне відкриття двійкового файлу для читання
    if(!fin) //так теж можна
        return; //неструктурно, зате уникаємо зайвого рівня відступів

    cout << "Дати у файлі: "
            << file << " file:\n";

    while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl
    {
        if (pl.day !=0) {
                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
        }//друк даних на екран
    }
    //тут слід було б закрити файл, але оскільки ми виходимо з функції, то об'єкт fstream буде знищено, а деструктор його закриває
}
Подякували: Limon1

15

Re: Файли. Дати.

Думаєте допоможе? Чи це тільки припущення? Гаразд, в любому випадку, не помішає.

16

Re: Файли. Дати.

Ще трохи подумав і вийшло щось на подобі цього.

#include <iostream>
#include <fstream>
#include <iomanip>
#include <Windows.h>
#include <stdio.h>
#include <time.h>
#include <ctime>
#pragma warning(disable:4996)
using namespace std;

const char* file = "ch.txt"; //стрічка з іменем файлу
struct date
{
    int day, month, year,closes_year, closes_month, closes_day,cy,cm,cd;
};

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int p[] = {3,4,5};
    date pl;
    cout << fixed << right;

    //друк вмістимого файлу

    ifstream fin; //створення об'єкту потоку вводу для нового файлу з іменем fin

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open()) //якщо файл відкрито

    {

        cout << "Дати у файлі: "

            << file << " file:\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.day !=0) {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            }//друк даних на екран

        }

        fin.close(); //закриття файлу

    }

    //додавання нових даних до файлу

    ofstream fout(file, ios_base::out | ios_base::app | ios_base::binary);

    //створення об'єкту потоку виводу (доповнення) для двійкового файлу з іменем fout

    if (!fout.is_open()) //якщо файл НЕ відкрито

    {

        cout << "Файл " << file << " не відкривається:\n\n";

        return 1;

    }
    cout << "Введіть день чи натисніть будь-яку літеру щоб закінчити: ";
    while (cin >> pl.day)

    {
        while (pl.day < 1 || pl.day > 31) 
        { 
        cout << "Введіть коректну дату: ";
        cin >> pl.day;
        }
            cout << "Введіть місяць: ";

            cin >> pl.month;
            while (pl.month < 1 || pl.month > 12)
            {
                cout << "Введіть коректну дату: ";
                cin >> pl.month;
            }

            cout << "Введіть рік: ";

            cin >> pl.year; 
            while (pl.year < 1)
            {
                cout << "Введіть коректну дату: ";
                cin >> pl.year;
            }

            fout.write((char*)&pl, sizeof pl); //запис у файл цілої введеної структури

            cout << "Введіть день чи натисніть будь-яку літеру щоб закінчити: ";
        
    }

    fout.close(); //закриття файлу

    //друк доповненого файлу


    fin.clear(); 

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())

    {
        cout << "Обновлений список дат: "

            << file << " file:\n\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.day != 0)
            {

                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
            } //друк даних на екран

        }
        cout << endl;
        fin.close(); //закриття файлу
    }
    fin.clear();
    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання
    
    if (fin.is_open())
    {
        cout << "Cписок весняних дат: " << file << " file:\n\n";

        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl

        {
            if (pl.month == p[0] || pl.month == p[1] || pl.month == p[2])
            {
                cout << setw(2) << pl.day << "/" << setprecision(0) << setw(2) << pl.month << "/" << setprecision(0) << setw(4) << pl.year << endl;
                //друк даних на екран
            } 
        }
        fin.close(); //закриття файлу
    }
    fin.clear();

    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())
    {
        int min = pl.year;
        cout << "\nНайменший рік: " << file << " file:\n\n";
        while (fin.read((char*)&pl, sizeof pl)) //читання цілої струтури з файлу у змінну pl
        {
            if (pl.year < min)
                min = pl.year;
        }
        cout << min << " рік\n\n";
        fin.close();
    }
    fin.clear();
    fin.open(file, ios_base::in | ios_base::binary); //відкриття двійкового файлу для читання

    if (fin.is_open())
    {
        time_t now = time(0);
        tm* ltm = localtime(&now);
        cout << "Сьогодні: " << endl;
        cout << "Рік: " << 1900 + ltm->tm_year << endl;
        cout << "Місяць: " << 1 + ltm->tm_mon << endl;
        cout << "День: " << ltm->tm_mday << endl;
        cout << "Час: " << ltm->tm_hour << " год ";
        cout << ltm->tm_min << " хв ";
        cout << ltm->tm_sec << " сек " << endl;
        cout << "\nНайближча дата:\n ";
        pl.closes_year = pl.year;
        pl.closes_month = pl.month;
        pl.closes_day = pl.day;
        while (fin.read((char*)&pl, sizeof pl))
        {
            pl.cy = abs(pl.year - 1900 + ltm->tm_year);
            pl.cm = abs(pl.month - 1 + ltm->tm_mon);
            pl.cd = abs(pl.day - ltm->tm_mday);
            if (pl.closes_year >= pl.cy)
            {
                if (pl.closes_year > pl.cy)
                {
                    pl.closes_year = pl.cy;
                    pl.closes_month = pl.cm;
                    pl.closes_day = pl.cd;
                    
                }
                else if (pl.closes_year == pl.cy)
                {
                    if (pl.closes_month > pl.cm)
                    {
                        pl.closes_year = pl.cy;
                        pl.closes_month = pl.cm;
                        pl.closes_day = pl.cd;
                        
                    }
                    else if (pl.closes_month == pl.cm)
                    {
                        if (pl.closes_day > pl.cd)
                        {
                            pl.closes_year = pl.cy;
                            pl.closes_month = pl.cm;
                            pl.closes_day = pl.cd;
                            
                        }
                        else if (pl.closes_day == pl.cd)
                        {
                            pl.closes_year = pl.cy;
                            pl.closes_month = pl.cm;
                            pl.closes_day = pl.cd;
                            
                        }

                    }

                }
            }
        }
        cout << abs(pl.closes_day) << "/" << abs(pl.closes_month) << "/" << abs(pl.closes_year);
    }

    cout << "\nГАРНОГО ДНЯ!\n";
    return 0;

}

Уже друкує і виникла інша помилка десь саме в цьому коді:

pl.closes_year = pl.year;
        pl.closes_month = pl.month;
        pl.closes_day = pl.day;
        while (fin.read((char*)&pl, sizeof pl))
        {
            pl.cy = abs(pl.year - 1900 + ltm->tm_year);
            pl.cm = abs(pl.month - 1 + ltm->tm_mon);
            pl.cd = abs(pl.day - ltm->tm_mday);
            if (pl.closes_year >= pl.cy)
            {
                if (pl.closes_year > pl.cy)
                {
                    pl.closes_year = pl.cy;
                    pl.closes_month = pl.cm;
                    pl.closes_day = pl.cd;
                    
                }
                else if (pl.closes_year == pl.cy)
                {
                    if (pl.closes_month > pl.cm)
                    {
                        pl.closes_year = pl.cy;
                        pl.closes_month = pl.cm;
                        pl.closes_day = pl.cd;
                        
                    }
                    else if (pl.closes_month == pl.cm)
                    {
                        if (pl.closes_day > pl.cd)
                        {
                            pl.closes_year = pl.cy;
                            pl.closes_month = pl.cm;
                            pl.closes_day = pl.cd;
                            
                        }
                        else if (pl.closes_day == pl.cd)
                        {
                            pl.closes_year = pl.cy;
                            pl.closes_month = pl.cm;
                            pl.closes_day = pl.cd;
                            
                        }

                    }

                }
            }
        }
        cout << abs(pl.closes_day) << "/" << abs(pl.closes_month) << "/" << abs(pl.closes_year);
    }

Видає не дату і ліміт типу.
https://replace.org.ua/uploads/images/10171/f273effb93fe60b504da9025497fb559.png

В інакшому випадку, якщо трохи змінити код. Друкує саме останню дату.

17

Re: Файли. Дати.

Ви так і не розклали код по функціях. Попередня проблема була в тому, що ви не закривали файл перед тим кодом, що виклали минулого разу, так?
Нащо вам 6 додаткових полів в структурі? Створіть просто додаткові змінні:

date close;
date c;
close = c; // це замість отих ваших pl.closes_year = pl.cy;pl.closes_month=pl.cy;pl.closes_day=pl.cd;

Ну і взагалі

        time_t now = time(nullptr);
        tm ltm = *localtime(&now);
        cout << "Сьогодні: " << endl;
        cout << "Рік: " << 1900 + ltm.tm_year << endl;
        cout << "Місяць: " << 1 + ltm.tm_mon << endl;
        cout << "День: " << ltm.tm_mday << endl;
        cout << "Час: " << ltm.tm_hour << " год ";
        cout << ltm.tm_min << " хв ";
        cout << ltm.tm_sec << " сек " << endl;
        cout << "\nНайближча дата:\n ";

        date best_date = {0,0,0};
        double best_diff = -1.0;//-1 - ознака, що ще жодної дати не перевірили

        while (fin.read((char*)&pl, sizeof pl))
        {
            ltm.tm_year = pl.year - 1900;
            ltm.tm_mon = pl.month - 1;
            ltm.tm_mday = pl.day;
            time_t read_date = mktime(&ltm);
            double diff = abs(difftime(now,read_date));
            if(best_diff<0 || diff<best_diff)
            {
                best_date = pl;
                best_diff = diff;
            }

        }
        cout << best_date.day << "/" << pl.month << "/" << pl.year << endl;
Подякували: Limon1

18

Re: Файли. Дати.

Виправив. Велике Вам дякую. Так дійсно набагато краще. Все працює.