我正在尝试读取一个包含 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;
}
这直接读取第三个单词,无论其位置或长度如何。