- вывода значений элементов структуры данных из файла в таблицу;
- изменения всей записи, номер которого был введен пользователем
- удаление всей записи, номер которого был введен пользователем
- сортировки выбранным самостоятельно способом записей файла
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
const char FILE_NAME[] = "driver.txt";
using namespace std;
size_t strlen_utf8(const string& str);
string InputDriver();
int SaveDriver(string);
int PrintDriversTable();
int main() {
setlocale(LC_ALL, "ukr");
PrintDriversTable();
int choice = 1;
while (choice) {
cout << "Додати водія в базу - 1, вивести дані на екран - 2, вихід - 0: ";
cin >> choice;
switch (choice) {
case 1:
SaveDriver(InputDriver());
break;
case 2:
PrintDriversTable();
break;
case 0:
break;
default:
cout << "Це не спрацювало, спробуйте повторити..." << endl;
}
}
return 0;
}
int PrintDriversTable() {
fstream in;
in.open(FILE_NAME, ios::in);
if (!in) {
cout << "Файлу з даними водіїв не існує, створюємо новий..." << endl;
string header = "№Авто Прізвище Ім'я По-батькові Сплачено";
SaveDriver(header);
return 0;
}
string line;
while (getline(in, line))
{
std::istringstream iss(line);
string carNumber, surname, name, fatherName, penalty;
if (!(iss >> carNumber >> surname >> name >> fatherName >> penalty)) { cout << "Error" << endl; break; } // якщо формат файлу не відповідає очікуваному
//танці з бубном, щоб вирівняти стовпчики для UTF8, оскільки функція length дає довжину в байтах, а не в символах
cout << setw(10 + (carNumber.length() - strlen_utf8(carNumber))) << setfill(' ') <<
carNumber << setw(20 + (surname.length() - strlen_utf8(surname))) << surname <<
setw(20 + (name.length() - strlen_utf8(name))) << name <<
setw(20 + (fatherName.length() - strlen_utf8(fatherName))) << fatherName <<
setw(10 + (penalty.length() - strlen_utf8(penalty))) << penalty << endl;
}
}
int SaveDriver(string data) {
fstream out;
out.open(FILE_NAME, ios::out | ios::app);
if (!out) return -1;
out << data;
out.close();
return 0;
}
string InputDriver() {
string carNumber, surname, name, fatherName, str = "";
bool penalty = 0;
cout << "Введіть номер автомобіля: ";
cin >> carNumber;
cout << "Введіть прізвище водія: ";
cin >> surname;
cout << "Ім'я: ";
cin >> name;
cout << "По-батькові: ";
cin >> fatherName;
cout << "Чи сплачено штраф? (1 - так, 0 - ні): ";
cin >> penalty;
str = carNumber + " " + surname + " " + name + " " + fatherName + " ";
if (penalty)
str += "Так\n";
else
str += "Ні\n";
return str;
}
size_t strlen_utf8(const string& str) {
size_t length = 0;
for (char c : str) {
if ((c & 0xC0) != 0x80) {
++length;
}
}
return length;
}