На данный вопрос уже ответили:
Всем, привет вот сижу пишу курсовую и не могу понять причину такого вывода из файла, дело в том что при загрузке данных из файла в список, у меня появляется один лишний узел с непонятными данными будто у меня в конце файла пробел но вот пробела в конце файла нет, проверял несколько раз, смотреть 3 последних функции.
Вот код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <locale.h>
#include <stdio.h>
#include <fstream>
using namespace std;
struct Date_mntn //Структура для хранения даты.
{
int day;
int month;
int year;
};
struct Car_park //Структура автопрака.
{
char model_car\[30\]; //Модель автомобиля.
char name_driver\[30\]; //Имя водителя.
char surname\[30\]; //Фамилия.
double price; //Балансовая стоимость автомобиля.
Date_mntn dtm; //Дата тех-обслуживания.
int route_number; //Номер маршрута.
int id;
};
struct List //Список.
{
Car_park crp;
List *next;
};
void output(List* begin);
void add_end(List** begin, List** end);
void add_begin(List** begin, List** end);
void sortList(List* begin);
void showDriverMinCost(List* begin);
void showAllLessDate(List* begin);
void showAllByLetter(List* begin);
void remove(List** begin, List** end);
void update(List* begin);
void save_f(List* begin);
void load_f(List** begin, List** end);
void add_f(List** begin, List** end);
int main()
{
setlocale(LC_CTYPE, "rus");
List *begin = NULL;
List *end = NULL;
int key;
cout << " __________________________________________________________________" << endl;
cout << "|Добро пожаловать в программу по управлению базой данных авто-парк. |" << end
cout << "|__________________________________________________________________|" << endl;
cout << " ___________________________________________________________________" << endl;
cout << "|Данные в этой базе хранятся в таком формате: |" << endl;
cout << "|-Модель. |" << endl;
cout << "|-ФИО водителя. |"<< endl;
cout << "|-Балансовая стоимость автобуса. |" << endl;
cout << "|-Дата тех-обслуживания. |" << endl;
cout << "|-Номер маршрута. |" << endl;
cout << "|___________________________________________________________________|" << endl;
cout << "Нажмите на любую клавишу для входа в командное меню программы." << endl;
_getch();
do
{
system("cls");
cout << "=======================================================================" << endl;
cout << "|Для выбора соответствующего действия введите цифру и нажмите <Enter>.|" << endl;
cout << "=======================================================================" << endl;
cout << "Меню программы:" << endl;
cout << "1- Добавить элемент в конец." << endl;
cout << "2- Добавить элемент в начало." << endl;
cout << "3- Вывод всего списка." << endl;
cout << "4- Отсортировать список по номеру маршрута." << endl;
cout << "5- Водитель с наименьшей стоимостью автобуса." << endl;
cout << "6- Список автобусов прошедших тех-обслуживание ранее заданной даты." << endl;
cout << "7- Поиск автобусов начинающихся на заданную букву." << endl;
cout << "8- Удалить элемент списка." << endl;
cout << "9- Редактирование информации в узле." << endl;
cout << "10- Сохранение введеных данных в файл." << endl;
cout << "11- Загрузка данных в программу." << endl;
cout << "0- Выход." << endl;
cout << "======================================================================" << endl;
cout << "Ваш выбор:";
cin >> key;
switch (key)
{
case 1:
system("cls");
add_end(&begin, &end);
_getch();
break;
case 2:
system("cls");
add_begin(&begin, &end);
_getch();
break;
case 3:
system("cls");
output(begin);
_getch();
break;
case 4:
system("cls");
sortList(begin);
_getch();
break;
case 5:
system("cls");
showDriverMinCost(begin);
_getch();
break;
case 6:
system("cls");
showAllLessDate(begin);
_getch();
break;
case 7:
system("cls");
showAllByLetter(begin);
_getch();
break;
case 8:
system("cls");
remove(&begin, &end);
_getch();
break;
case 9:
system("cls");
update(begin);
_getch();
break;
case 10:
system("cls");
save_f(begin);
_getch();
break;
case 11:
system("cls");
load_f(&begin,&end);
_getch();
break;
case 0:
break;
default:
cout << "В меню нет такого пункта." << endl;
break;
}
} while (key != 0);
_getch();
return 0;
}
void add_end(List** begin, List** end)
{
if (!*begin)
{
*end = new List;
cout << "Модель автобуса:";
cin >> (*end)->crp.model_car;
cout << "Имя водителя:";
cin >> (*end)->crp.name_driver;
cout << "Фамилия:";
cin >> (*end)->crp.surname;
cout << "Стоимость автобуса в $:";
while (!(cin >> (*end)->crp.price) || ((*end)->crp.price) < 0)
{
cout << "\nОшибка ввода !!!" << endl;
cout << "Некоректно введена цена либо не заполнен пункт." << endl;
cout << "Cтоимость автобуса в $:";
}
cout << "Введите дату тех-обслуживания в формате д/м/гггг:" << endl;
cout << "День:";
while (!(cin >> (*end)->crp.dtm.day) || ((*end)->crp.dtm.day) > 30 || ((*end)->crp.dtm.day) < 0)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный день либо пункт не заполне." << endl;
cout << "День:";
}
cout << "Месяц:";
while (!(cin >> (*end)->crp.dtm.month) || ((*end)->crp.dtm.month) > 12 || ((*end)->crp.dtm.month) < 1)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный месяц либо пункт не заполне." << endl;
cout << "Месяц:";
}
cout << "Год:";
while (!(cin >> (*end)->crp.dtm.year) || ((*end)->crp.dtm.year) > 2018 || ((*end)->crp.dtm.year) < 1913)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный год либо пункт не заполне." << endl;
cout << "Год:";
}
cout << "Номер маршрута:";
cin >> (*end)->crp.route_number;
cout << "Введите id узла:";
cin >> (*end)->crp.id;
(*end)->next = NULL;
*begin = *end;
return;
}
(*end)->next = new List;
*end = (*end)->next;
cout << "Модель автобуса:";
cin >> (*end)->crp.model_car;
cout << "Имя водителя:";
cin >> (*end)->crp.name_driver;
cout << "Фамилия:";
cin >> (*end)->crp.surname;
cout << "Стоимость автобуса в $:";
while (!(cin >> (*end)->crp.price) || ((*end)->crp.price) < 0)
{
cout << "\nОшибка ввода !!!" << endl;
cout << "Некоректно введена цена либо не заполнен пункт." << endl;
cout << "Cтоимость автобуса в $:";
}
cout << "Введите дату тех-обслуживания в формате д/м/гггг:" << endl;
cout << "День:";
while (!(cin >> (*end)->crp.dtm.day) || ((*end)->crp.dtm.day) > 30 || ((*end)->crp.dtm.day) < 0)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный день либо пункт не заполне." << endl;
cout << "День:";
}
cout << "Месяц:";
while (!(cin >> (*end)->crp.dtm.month) || ((*end)->crp.dtm.month) > 12 || ((*end)->crp.dtm.month) < 1)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный месяц либо пункт не заполне." << endl;
cout << "Месяц:";
}
cout << "Год:";
while (!(cin >> (*end)->crp.dtm.year) || ((*end)->crp.dtm.year) > 2018 || ((*end)->crp.dtm.year) < 1913)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный год либо пункт не заполне." << endl;
cout << "Год:";
}
cout << "Номер маршрута:";
cin >> (*end)->crp.route_number;
cout << "Введите id узла:";
cin >> (*end)->crp.id;
(*end)->next = NULL;
}
void add_begin(List** begin, List** end)
{
if (!*begin)
{
*end = new List;
cout << "Модель автобуса:";
cin >> (*end)->crp.model_car;
cout << "Имя водителя:";
cin >> (*end)->crp.name_driver;
cout << "Фамилия:";
cin >> (*end)->crp.surname;
cout << "Стоимость автобуса в $:";
while (!(cin >> (*end)->crp.price) || ((*end)->crp.price) < 0)
{
cout << "\nОшибка ввода !!!" << endl;
cout << "Некоректно введена цена либо не заполнен пункт." << endl;
cout << "Cтоимость автобуса в $:";
}
cout << "Введите дату тех-обслуживания в формате д/м/гггг:" << endl;
cout << "День:";
while (!(cin >> (*end)->crp.dtm.day) || ((*end)->crp.dtm.day) > 30 || ((*end)->crp.dtm.day) < 0)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный день либо пункт не заполне." << endl;
cout << "День:";
}
cout << "Месяц:";
while (!(cin >> (*end)->crp.dtm.month) || ((*end)->crp.dtm.month) > 12 || ((*end)->crp.dtm.month) < 1)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный месяц либо пункт не заполне." << endl;
cout << "Месяц:";
}
cout << "Год:";
while (!(cin >> (*end)->crp.dtm.year) || ((*end)->crp.dtm.year) > 2018 || ((*end)->crp.dtm.year) < 1913)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный год либо пункт не заполне." << endl;
cout << "Год:";
}
cout << "Номер маршрута:";
cin >> (*end)->crp.route_number;
cout << "Введите id узла:";
cin >> (*end)->crp.id;
(*end)->next = NULL;
*begin = *end;
return;
}
List* n = new List;
cout << "Модель автобуса:";
cin >> n->crp.model_car;
cout << "Имя водителя:";
cin >> n->crp.name_driver;
cout << "Фамилия:";
cin >> n->crp.surname;
cout << "Стоимость автобуса в $:";
while (!(cin >> n->crp.price) || (n->crp.price) < 0)
{
cout << "\nОшибка ввода !!!" << endl;
cout << "Некоректно введена цена либо не заполнен пункт." << endl;
cout << "Cтоимость автобуса в $:";
}
cout << "Введите дату тех-обслуживания в формате д/м/гггг:" << endl;
cout << "День:";
while (!(cin >> n->crp.dtm.day) || (n->crp.dtm.day) > 30 || (n->crp.dtm.day) < 0)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный день либо пункт не заполне." << endl;
cout << "День:";
}
cout << "Месяц:";
while (!(cin >> n->crp.dtm.month) || (n->crp.dtm.month) > 12 || (n->crp.dtm.month) < 1)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный месяц либо пункт не заполне." << endl;
cout << "Месяц:";
}
cout << "Год:";
while (!(cin >> n->crp.dtm.year) || (n->crp.dtm.year) > 2018 || (n->crp.dtm.year) < 1913)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный год либо пункт не заполне." << endl;
cout << "Год:";
}
cout << "Номер маршрута:";
cin >> n->crp.route_number;
cout << "Введите id узла:";
cin >> n->crp.id;
n->next = *begin;
*begin = n;
}
void output(List* begin)
{
if (!begin)
{
cout << "Список пуст." << endl;
}
List* print = begin;
while (print)
{
cout << " _____________________________" << endl;
cout << "|Модель автобуса:" << print->crp.model_car << endl;
cout << "|ФИО:" << print->crp.name_driver << " " << print->crp.surname << endl;
cout << "|Стоимость автобуса:" << print->crp.price << "$" << endl;
cout << "|Дата:" << print->crp.dtm.day << "." << print->crp.dtm.month << "." << print->crp.dtm.year << endl;
cout << "|Номер маршрута:" << print->crp.route_number << endl;
cout << "|id:" << print->crp.id << endl;
cout << "|____________________________" << endl;
cout << "\n";
print = print->next;
}
}
void sortList(List* begin)
{
if (!begin)
{
cout << "Список пуст." << endl;
return;
}
List* ptrN = begin;
while (ptrN->next != NULL)
{
List* ptr = begin;
while (ptr->next != NULL)
{
if (ptr->crp.route_number > ptr->next->crp.route_number)
{
Car_park tmp = ptr->crp;
ptr->crp = ptr->next->crp;
ptr->next->crp = tmp;
}
ptr = ptr->next;
}
ptrN = ptrN->next;
}
}
void showDriverMinCost(List* begin)
{
List* ptr = begin;
List* min = begin;
while (ptr != NULL)
{
if (ptr->crp.price < min->crp.price)
{
min = ptr;
}
ptr = ptr->next;
}
cout << " _____________________________" << endl;
cout << "|Модель автобуса:" << min->crp.model_car << endl;
cout << "|ФИО:" << min->crp.name_driver << " " << min->crp.surname << endl;
cout << "|Стоимость автобуса:" << min->crp.price << "$" << endl;
cout << "|Дата:" << min->crp.dtm.day << "." << min->crp.dtm.month << "." << min->crp.dtm.year << endl;
cout << "|Номер маршрута:" << min->crp.route_number << endl;
cout << "|id:" << min->crp.id << endl;
cout << "|____________________________" << endl;
cout << "\n";
}
void showAllLessDate(List* begin)
{
List* ptr = begin;
int day;
int month;
int year;
cout << "Введите дату для сравнения:" << endl;
cout << "День:";
while (!(cin >>day) || day > 30 || day < 0)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный день либо пункт не заполне." << endl;
cout << "День:";
}
cout << "Месяц:";
while (!(cin >> month) || month > 12 || month < 1)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный месяц либо пункт не заполне." << endl;
cout << "Месяц:";
}
cout << "Год:";
while (!(cin >> year) || year > 2018 || year < 1913)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный год либо пункт не заполне." << endl;
cout << "Год:";
}
while (ptr != NULL)
{
if (ptr->crp.dtm.year == year)
{
if (ptr->crp.dtm.month == month)
{
if (ptr->crp.dtm.day < day)
{
cout << " _____________________________" << endl;
cout << "|Модель автобуса:" << ptr->crp.model_car << endl;
cout << "|ФИО:" << ptr->crp.name_driver << " " << ptr->crp.surname << endl;
cout << "|Стоимость автобуса:" << ptr->crp.price << "$" << endl;
cout << "|Дата:" << ptr->crp.dtm.day << "." << ptr->crp.dtm.month << "." << ptr->crp.dtm.year << endl;
cout << "|Номер маршрута:" << ptr->crp.route_number << endl;
cout << "|id:" << ptr->crp.id << endl;
cout << "|____________________________" << endl;
cout << "\n";
}
}
if (ptr->crp.dtm.month < month)
{
cout << " _____________________________" << endl;
cout << "|Модель автобуса:" << ptr->crp.model_car << endl;
cout << "|ФИО:" << ptr->crp.name_driver << " " << ptr->crp.surname << endl;
cout << "|Стоимость автобуса:" << ptr->crp.price << "$" << endl;
cout << "|Дата:" << ptr->crp.dtm.day << "." << ptr->crp.dtm.month << "." << ptr->crp.dtm.year << endl;
cout << "|Номер маршрута:" << ptr->crp.route_number << endl;
cout << "|id:" << ptr->crp.id << endl;
cout << "|____________________________" << endl;
cout << "\n";
}
}
if (ptr->crp.dtm.year < year)
{
cout << " _____________________________" << endl;
cout << "|Модель автобуса:" << ptr->crp.model_car << endl;
cout << "|ФИО:" << ptr->crp.name_driver << " " << ptr->crp.surname << endl;
cout << "|Стоимость автобуса:" << ptr->crp.price << "$" << endl;
cout << "|Дата:" << ptr->crp.dtm.day << "." << ptr->crp.dtm.month << "." << ptr->crp.dtm.year << endl;
cout << "|Номер маршрута:" << ptr->crp.route_number << endl;
cout << "|id:" << ptr->crp.id << endl;
cout << "|____________________________" << endl;
cout << "\n";
}
ptr = ptr->next;
}
}
void showAllByLetter(List* begin)
{
char Letter;
cout << "Введите букву для поиска нужного автобуса:" << endl;
cout << "Буква:";
cin >> Letter;
List* ptr = begin;
while (ptr != NULL)
{
if (ptr->crp.model_car\[0\] == Letter)
{
cout << " _____________________________" << endl;
cout << "|Модель автобуса:" << ptr->crp.model_car << endl;
cout << "|ФИО:" << ptr->crp.name_driver << " " << ptr->crp.surname << endl;
cout << "|Стоимость автобуса:" << ptr->crp.price << "$" << endl;
cout << "|Дата:" << ptr->crp.dtm.day << "." << ptr->crp.dtm.month << "." << ptr->crp.dtm.year << endl;
cout << "|Номер маршрута:" << ptr->crp.route_number << endl;
cout << "|id:" << ptr->crp.id << endl;
cout << "|____________________________" << endl;
cout << "\n";
}
ptr = ptr->next;
}
}
void remove(List** begin, List** end)
{
List *ptr = *begin;
List *previous = *begin;
int id;
cout << "Введите id узла который хотите удалить:";
cin >> id;
while (ptr != NULL)
{
if (ptr->crp.id == id)
{
if (ptr == *begin)
{
*begin = ptr->next;
}
if (ptr->next == NULL)
{
*end = previous;
}
if (begin == NULL)
{
end = NULL;
}
List *following = ptr->next;
previous->next = following;
delete ptr;
return;
}
previous = ptr;
ptr = ptr->next;
}
}
void update(List* begin)
{
List* ptr = begin;
int id;
cout << "Введите id узла который хотите редактировать:";
cin >> id;
while (ptr != NULL)
{
if (ptr->crp.id == id)
{
cout << "Модель автобуса:";
cin >> ptr->crp.model_car;
cout << "Имя водителя:";
cin >> ptr->crp.name_driver;
cout << "Фамилия:";
cin >> ptr->crp.surname;
cout << "Стоимость автобуса в $:";
while (!(cin >> ptr->crp.price) || (ptr->crp.price) < 0)
{
cout << "\nОшибка ввода !!!" << endl;
cout << "Некоректно введена цена либо не заполнен пункт." << endl;
cout << "Cтоимость автобуса в $:";
}
cout << "Введите дату тех-обслуживания в формате д/м/гггг:" << endl;
cout << "День:";
while (!(cin >> ptr->crp.dtm.day) || (ptr->crp.dtm.day) > 30 || (ptr->crp.dtm.day) < 0)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный день либо пункт не заполне." << endl;
cout << "День:";
}
cout << "Месяц:";
while (!(cin >> ptr->crp.dtm.month) || (ptr->crp.dtm.month) > 12 || (ptr->crp.dtm.month) < 1)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный месяц либо пункт не заполне." << endl;
cout << "Месяц:";
}
cout << "Год:";
while (!(cin >> ptr->crp.dtm.year) || (ptr->crp.dtm.year) > 2018 || (ptr->crp.dtm.year) < 1913)
{
cout << "\nОшибка ввода !!!\n";
_getch();
system("cls");
cout << "Введен некоректный год либо пункт не заполне." << endl;
cout << "Год:";
}
cout << "Номер маршрута:";
cin >> ptr->crp.route_number;
cout << "Введите id узла:";
cin >> ptr->crp.id;
}
ptr = ptr->next;
}
}
void save_f(List* begin)
{
ofstream fout("database.txt");
if (fout)
{
List* tmp = begin;
while (tmp != NULL)
{
fout << tmp->crp.model_car << " ";
fout << tmp->crp.name_driver << " ";
fout << tmp->crp.surname << " ";
fout << tmp->crp.price << " ";
fout << tmp->crp.dtm.day << " " << tmp->crp.dtm.month << " " << tmp->crp.dtm.year << " ";
fout << tmp->crp.route_number << " ";
fout << tmp->crp.id << " ";
tmp = tmp->next;
}
fout.close();
}
else
cout << "Ошибка записи в файл!!!" << endl;
}
void load_f(List** begin, List** end)
{
List* tmp = new List;
ifstream fin;
fin.open("database.txt");
if (!fin.is_open())
{
cout << "Такого файла не существует!!!" << endl;
return;
}
while (!fin.eof())
{
fin >> tmp->crp.model_car;
cout << tmp->crp.model_car << endl;
fin >> tmp->crp.name_driver;
cout << tmp->crp.name_driver << endl;
fin >> tmp->crp.surname;
cout << tmp->crp.surname << endl;
fin >> tmp->crp.price;
cout << tmp->crp.price << endl;
fin >> tmp->crp.dtm.day;
fin >> tmp->crp.dtm.month;
fin >> tmp->crp.dtm.year;
cout << tmp->crp.dtm.day << tmp->crp.dtm.month << tmp->crp.dtm.year << endl;
fin >> tmp->crp.route_number;
cout << tmp->crp.route_number << endl;
fin >> tmp->crp.id;
cout << tmp->crp.id << endl;
add_f(begin, &tmp);
}
}
void add_f(List** begin, List** end)
{
if (!*begin)
{
(*end)->crp.model_car;
(*end)->crp.name_driver;
(*end)->crp.surname;
(*end)->crp.price;
(*end)->crp.dtm.day;
(*end)->crp.dtm.month;
(*end)->crp.dtm.year;
(*end)->crp.route_number;
(*end)->crp.id;
(*end)->next = NULL;
*begin = *end;
}
(*end)->next = new List;
*end = (*end)->next;
(*end)->crp.model_car;
(*end)->crp.name_driver;
(*end)->crp.surname;
(*end)->crp.price;
(*end)->crp.dtm.day;
(*end)->crp.dtm.month;
(*end)->crp.dtm.year;
(*end)->crp.route_number;
(*end)->crp.id;
(*end)->next = NULL;
}
Эта ошибка стара как мир. Состояние файла при достижении конца как EOF
возникает только ПОСЛЕ попытки считать информацию. В функции load_f
нужно проконтролировать считывание первого поля.
while ( ! fin . eof ( ) ) {
fin >> tmp->crp.model_car;
if ( fin . eof ( ) ) break ;
cout << tmp->crp.model_car << endl;
fin >> tmp->crp.name_driver;
cout << tmp->crp.name_driver << endl;
...
Виртуальный выделенный сервер (VDS) становится отличным выбором
Я любитель очень красивого и оптимального программного кода, и, возможно, мой вопрос не совсем важныйВсем известно, что код:
Работаю с TCP и столкнулся с вопросом, который по факту упирается в понимание протокола