Я хотел бы поблагодарить всех, кто помог мне с моей проблемой. Я наконец смог организовать данные по году рождения! Очень ценится. Если кто-нибудь может помочь мне с этим последним вопросом, это было бы здорово
Если у меня есть строки в текстовом файле, которые выглядят так:
1 4:48:08 Orvar Steingrimsson 1979 30 - 39 ara IS200
2 4:52:25 Gudni Pall Palsson 1987 18 - 29 ara IS870
Как я могу вывести эти данные в новый текстовый файл, но перечислить только три вещи: год — имя — время … так, чтобы эти две строки выглядели так:
1979 Orvar Steingrimsson 4:48:08
1987 Gudni Pall Palsson 4:52:25
Мое предположение было таким:
ifstream in("inputfile.txt");
ofstream out("outputfile.txt");
int score, year;
string name, time, group, team;
while (getline(in,str));
in >> score >> time >> name >> year >> group >> team;
//and then do something like this
out << year << name << time << '\n';
Однако у меня есть ощущение, что я не смогу пройтись по всему текстовому файлу и всем 200 строкам. Любые советы приветствуются! Спасибо
«Я знаю, что год — это всегда от 54 до 58 символа в каждой строке»
Итак, рассмотрим это:
int main ()
{
ifstream in("laugavegurinn.txt", ios::in);
ofstream out("laugavegurinn2.txt");
string str;
multimap<int, string> datayear;
while (getline(in,str)) {
int year = stoi(str.substr(54, 4));
datayear.insert(make_pair(year,str)); //use insert function
// multimap don't have [] operator
}
for (auto v : datayear)
out << v.second << "\n";
in.close();
out.close();
}
Для начала прочитайте строки в std::vector<std::string>
,
с помощью std::getline
, Затем отсортируйте их в нужном порядке.
Затем выведите их. Так main
становится в основном три строки:
std::vector<Line> data( readLines( inFile ) );
sortByBirthYear( data );
std::copy( data.begin(), data.end(), std::ostream_iterator<std::string>( outFile, "\n" ) );
Конечно, readLines
а также sortByBirth
нужно записать как
хорошо, но они оба довольно тривиальны.
В качестве альтернативы и, возможно, лучше, вы могли бы определить
DataLine
класс с operator>>
, а также operator<<
а также
функция сравнения (operator<
), а затем все, что вам нужно, это:
std::vector<DataLine> data(
(std::istream_iterator<DataLine>( inFile )),
(std::istream_iterator<DataLine>()) );
std::sort( data.begin(), data.end() );
std::copy( data.begin(),
data.end(),
std::ostream_iterator<std::string>( outFile, "\n" ) );
Это то, что я бы сделал, но если вы только начали C ++, вы можете не
уже охватили необходимые основы, такие как классы и оператор
перегрузка.
Я бы также добавил одну вещь, основанную на вашем коде: никогда не открывайте
данные, которые вы вводите без предварительной проверки, что ввод
удалось.
РЕДАКТИРОВАТЬ (реализация с использованием только основных функций):
Как указано выше (но без Line
тип):
std::vector<std::string> data( readLines( inFile ) );
std::sort( data.begin(), data.end(), orderByBirthYear );
std::copy( data.begin(), data.end(),
std::ostream_iterator<std::string>( outFile, "\n" ) );
с:
std::vector<std::string>
readLines( std::istream& source )
{
std::vector<std::string> results;
std::string line;
while ( std::getline( source, line ) ) {
results.push_back( line );
}
return results;
}
bool
orderByBirthYear( std::string const& lhs, std::string const& rhs )
{
return lhs.compare( 54, 4, rhs, 54, 4 ) < 0;
}
Но я настаиваю: это не как это решить. любой
разумное решение будет начинаться с определения класса для вашего
данные, и определить все операции, используя это. Это означает
не просто определяя class
, но и перегрузка оператора; если
вы только начали, вы, вероятно, еще не видели ничего из этого
(и назначение не является хорошим признаком в отношении
качество конечно).
В остальном вы на правильном пути; для линии ориентированной
вход, вы должны прочитать, используя getline
, После этого, однако,
строка была извлечена из ввода; разобрать его дальше,
вам нужно инициализировать std::istringstream
с этим и читать
От этого. За исключением того, что ваш формат ввода, кажется, основан на
столбцы, так что вы, вероятно, будете использовать substr
функция
std::string
чтобы получить отдельные поля. Как только вы получили
их, вы захотите удалить ведущие и конечные пробелы, и
возможно преобразовать в числовые типы (хотя для сортировки по
год, это не обязательно). Но все это логично
происходят в определенном пользователем operator>>
к Data
учебный класс.
(Точно так же, вы бы предоставили пользовательский operator<<
написать
отсортированные данные. И, как правило, orderByBirthYear
, выше,
будет также класс.)