0

次の 4 つの例のような 200 行のテキスト ファイルを読み込もうとしています。

1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200 
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 
3    5:14:24   Ryan Paavola                        1984   18 - 29 ara      USA
4    5:18:43   Hendrik Sporing                     1990   18 - 29 ara      GER

現在、セリフはご覧のように時間ごとに整理されていますが、各出場者の生年ごとに整理したいので、この場合、これらの 4 つのセリフは次のようになります。

4    5:18:43   Hendrik Sporing                     1990   18 - 29 ara      GER
2    4:52:25   Gudni Pall Palsson                  1987   18 - 29 ara      IS870 
3    5:14:24   Ryan Paavola                        1984   18 - 29 ara      USA
1    4:48:08   Orvar Steingrimsson                 1979   30 - 39 ara      IS200 

生年順に行を並べ替えることになっていて、入力ファイルは「laugavegurinn.txt」、出力ファイルは「laugavegurinn2.txt」です。

誰かが私のコードの問題を指摘したり、これを行うためのより良い方法を提案したりできますか? 注意してください、C ++にあまり熟練していないので、助けていただければ幸いです。これは私のコードです:

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

using namespace std;

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

int main () {
    ifstream in;
    ofstream out;
    in.open("laugavegurinn.txt");
    out.open("laugavegurinn2.txt");

    process(in, out);
}
4

2 に答える 2

0

これは正しく機能していますか?改善を求めているだけです。

これを行う通常の方法は、ソートされていないすべての行を a に追加し、カスタム順序でstd::vector<std::string>呼び出しstd::sortて目的の順序にソートし、出力することです。

あなたのソリューションよりも少し効率的でなければなりません(とにかくかなり良いです)。

于 2013-09-27T17:43:54.373 に答える
0

を使用する代わりにstr.substr(54 ,4)、次の方法を使用することもできます (文字位置を使用すると、形式が変更された場合にエラーが発生しやすくなります)。

#include <iostream>
#include <string>
#include <sstream>
#include <iterator>
using namespace std;

int main() {

    string myString = "Three    separate    tokens";

    istringstream iss(myString);
    auto it = istream_iterator<string>(iss);
    string thirdToken = *(it ++ ++);

    cout << thirdToken;
}

これにより、位置や長さに関係なく、3 番目の単語が直接読み取られます。

于 2013-09-27T17:44:23.010 に答える