按每行同一位置出现的 4 个数字对文本文件中的 200 行进行排序

Sorting 200 lines in text file by 4 numbers that occur at same spot on each line

本文关键字:文本 文件 排序 数字 位置      更新时间:2023-10-16

我正在尝试读取一个包含 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    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);
}

这是有效的吗?您只是在寻找改进。

执行此操作的常用方法是将所有未排序的行添加到std::vector<std::string>,然后使用自定义顺序调用std::sort以按所需顺序排序,然后打印出来。

应该比你的解决方案更有效一点(无论如何这都很好)。

作为使用

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;
}

这直接读取第三个单词,无论其位置或长度如何。