Во-первых, вам, вероятно, понадобится структура для хранения значений. Существует стандартная структура, тм, но в ней много членов, некоторые из которых зависят от других, и было бы странно, если бы yday не соответствовал wday и mday.
struct Date {
int year;
int month;
int day;
};
Тогда вам нужна функция, способная считывать данные в структуру. Сначала вам нужно открыть файл, прочитать первую строку и обработать его. Для этого вы можете использовать ifstream, который является стандартным классом в C ++ для чтения файлов.
std::ifstream f( fileName.c_str() );
Затем вам нужно прочитать строку, в которой хранится дата. Так как это упражнение, я предположил, что это было первым. getline()
читает целую строку из ввода и сохраняет ее в ранее созданной строке.
std::string line;
std::getline( f, line );
Наконец, вы должны обработать эту строку. Для этого есть разные способы, но, вероятно, наиболее удобный в C ++ - это использовать потоки, связанные со строками, и читать каждое поле по его типу.
std::istringstream str( line );
str >> date.year
>> firstDot
>> date.month
>> lastDot
>> date.day
;
Что касается проверки ошибок, вы можете сделать различные проверки (я оставлю это вам). По крайней мере, мы должны проверить, что мы прочитали точки как разделители, где мы должны.
if ( firstDot != '.'
|| lastDot != '.' )
{
date.year = date.month = date.day = -1;
}
Вот и вся функция:
bool readDate(const std::string &fileName, Date &date)
{
char firstDot;
char lastDot;
std::ifstream f( fileName.c_str() );
bool toret = false;
date .year = date.month = date.day = -1;
if ( f.is_open() ) {
std::string line;
// Read line containing the date
std::getline( f, line );
// Chk string
std::istringstream str( line );
str >> date.year
>> firstDot
>> date.month
>> lastDot
>> date.day
;
if ( firstDot != '.'
|| lastDot != '.' )
{
date.year = date.month = date.day = -1;
}
else toret = true;
}
return toret;
}
Как видите, состояние ошибки сигнализируется возвращаемым значением функции, а также содержимым struct Date .
Надеюсь, это поможет.