Тема: Файли. Дати.
Доброго дня. Дійшов до вивчення файлів. Трохи розібрався, щось зрозумів. Здебільшого виходить тільки з текстом. З числами - проблема.
Ось поставлені завдання:
Задано файл, що містить дати. Кожна дата – це число, місяць і рік. Знайти:
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;
}
Завчасно дякую.