0

次のような 200 行のテキスト ファイルがあります。

1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200 
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 

私のコードは、上記の例のように時間ではなく、各競技者の生年でこれらの行を並べ替えます。したがって、行は次のようにソートされます: (より多くの行のみ)

2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 
1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200

私の質問は、年 - 名前 - 時間の 3 つの項目をリストする方法を教えてください。これらの 2 行は次のようになります。

1987   Gudni Pall Palsson    4:52:25  
1979   Orvar Steingrimsson   4:48:08

これまでのところ、行を正しい順序でソートする私のコード:

#include <iostream> //for basic functions
#include <fstream> //for basic file operations
#include <string> //for string operations
#include <map> //for multimap functions

using namespace std;

int main ()
{
ifstream  in("laugavegurinn.txt", ios::in);
ofstream out("laugavegurinn2.txt");
string str;
multimap<int, string> datayear; //creates multimap linking each line to year

in.ignore(80);//ignores header of the file - 80 characters - to escape problems with while loop

// while (getline(in,str)) {
 //   string name = str.substr(18,30);
   // string time = str.substr(8,7);

//}


while (getline(in,str)) {
    int year = stoi(str.substr(54, 4));
    datayear.insert(make_pair(year,str)); //insert function and pairs year and string 
}

for (auto v : datayear)
    out << v.second << "\n";

in.close();
out.close();
}
4

4 に答える 4

1

各行を単一の文字列として扱っています。フィールドを再配置する唯一の方法は、各フィールドを抽出して個別に出力することです。私の例では、出力したいフィールドを持つ構造体を使用しています。

#include <iostream> //for basic functions
#include <fstream> //for basic file operations
#include <string> //for string operations
#include <map> //for multimap functions

using namespace std;

typedef struct {
  int year;
  string name;
  string time;
} Fields;

int main ()
{
  ifstream  in("names.txt", ios::in);
  ofstream out("namesout.txt");
  string str;
  multimap<int, Fields> data; //creates multimap linking each line to year

  in.ignore(80);

  Fields tempField;

  while (getline(in,str)) {
    tempField.year = stoi(str.substr(51, 4));
    tempField.name=  str.substr(15, 30);
    tempField.time=  str.substr(5, 8);
    data.insert(make_pair(tempField.year,tempField)); //insert function and pairs year and string
  }

  for (auto v : data)
    out << v.second.year << " " << v.second.name  << " " << v.second.time<< "\n";

  in.close();
  out.close();
}
于 2013-09-27T20:46:19.867 に答える