Заказ данных по-новому из потока

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

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

1

Решение

Исходя из вопроса выше, я думаю, что вам нужно разделить файл с разделителем » или ‘\ t’.
В C ++ вы можете использовать библиотеку boost.
В бусте:

#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>

using namespace std;

int main( int argc, char** argv )
{
string s = "Hello, the beautiful world!";
vector<string> rs;   // store the fields in your text.
boost::split( rs, s, boost::is_any_of( " ,!" ), boost::token_compress_on );
for( vector<string>::iterator it = rs.begin(); it != rs.end(); ++ it )
cout << *it << endl;

return 0;
}

или используйте функцию strtok ()

#include <stdlib.h>
#include <iostream>
#include <string.h>

using namespace std;

int main( int argc, char** argv )
{
char str[] = "Hello, the beautiful world!";
char spliter[] = " ,!";

char * pch;
pch = strtok( str, spliter );
while( pch != NULL )
{
cout << pch << endl;
pch = strtok( NULL, spliter );
}
return 0;
}

Вы также можете использовать find или же strchr функции, чтобы найти разделитель, то вы можете разделить его. Вы могли бы получить year в vector<string> rs в первом примере или pch во втором примере.

0

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

После того, как вы извлечете подстроку, вы можете позвонить strtol() (или же std::stoi() если у вас есть C ++. 11), чтобы преобразовать строку в целое число. Если у вас есть год и строка данных, вы можете сохранить их в какой-то таблице, например std::multimap<>,

Без C ++. 11:

void process (std::istream &in, std::ostream &out) {
typedef std::multimap<int, std::string> table_type;
table_type data_by_year;
std::string str;
while (std::getline(in,str)) {
int year = strtol(str.substr(54, 4).c_str(), 0, 10);
data_by_year.insert(std::make_pair(year, str));
}
for (table_type::iterator i = data_by_year.begin();
i != data_by_year.end();
++i) {
out << i->second << "\n";
}
}

В C ++. 11:

void process (std::istream &in, std::ostream &out) {
std::multimap<int, std::string> data_by_year;
std::string str;
while (std::getline(in,str)) {
int year = std::stoi(str.substr(54, 4));
data_by_year.insert(std::make_pair(year, str));
}
for (auto v : data_by_year) {
out << v.second << "\n";
}
}
0

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