Если у меня есть строки в текстовом файле, которые выглядят так:
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 строкам. Любые советы приветствуются!
Исходя из вопроса выше, я думаю, что вам нужно разделить файл с разделителем » или ‘\ 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
во втором примере.
После того, как вы извлечете подстроку, вы можете позвонить 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";
}
}