Похоже, что вы читаете запись, которая содержит одну или несколько подзаписей.
Я рекомендую использовать класс Date
, а также класс Record
.
class Date
{
public:
unsigned int month_num;
unsigned int day_num;
unsigned int year_num;
friend std::istream& operator>>(std::istream& input, Date& d);
};
std::istream& operator>>(std::istream& input, Date& d)
{
char forward_slash;
input >> d.month_num; input >> forward_slash;
input >> d.day_num; input >> forward_slash;
input >> d.year_num;
return input;
}
Перегрузка operator>>
для класса Date
пригодится позже.
Теперь класс записи:
class Record
{
public:
std::string state;
std::string region;
std::string latitude;
std::string longitude;
// A container for the date subrecords
std::vector<Date> dates;
friend std::istream& operator>>(std::istream& input, Record& r);
};
std::istream& operator>>(std::istream& input, Record& r)
{
std::string text_line;
std::getline(input, text_line);
std::istringstream record_stream(text_line);
std::getline(record_stream, r.state, ',');
std::getline(record_stream, r.region, ',');
std::getline(record_stream, r.latitude, ',');
std::getline(record_stream, r.longitude, ',');
Date d;
while (record_stream >> d)
{
r.dates.push_back(d);
char comma;
record_stream >> comma;
}
return input;
}
Вышеуказанная функция читает текстовую строку ввода, так как записи завершаются переводом строки. Поток создается из текстовой строки. Поток помогает в чтении переменного количества дат.
Редактировать 1: чтение в файле
Ваш входной код будет выглядеть примерно так:
std::vector<Record> database;
Record r;
while (fin >> r)
{
database.push_back(r);
}
Да, вы можете используйте C -строки и массивы, но потоки C ++ и std::vector
упрощают код, и простой код имеет меньше дефектов, чем сложный код.
Кроме того, классы std::vector
и std::string
управляют динамической c памятью для вас. Они расширяются по мере необходимости. Нет необходимости проверять переполнение массива. Их также легче пройти. Передача массивов также требует пропускной способности (и, возможно, количества элементов в массиве).