Обработка строк из одного текстового файла в другой

Я хотел бы поблагодарить всех, кто помог мне с моей проблемой. Я наконец смог организовать данные по году рождения! Очень ценится. Если кто-нибудь может помочь мне с этим последним вопросом, это было бы здорово

Если у меня есть строки в текстовом файле, которые выглядят так:

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 строкам. Любые советы приветствуются! Спасибо

0

Решение

«Я знаю, что год — это всегда от 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();
}
0

Другие решения

Для начала прочитайте строки в 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, выше,
будет также класс.)

0

По вопросам рекламы [email protected]