C++ 将文本文件中的200行按每行上相同位置出现的4个数字排序
我试图阅读一个有200行的文本文件,看起来像以下四个示例:C++ 将文本文件中的200行按每行上相同位置出现的4个数字排序,c++,sorting,stream,xcode5,C++,Sorting,Stream,Xcode5,我试图阅读一个有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
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;
空洞过程(istream&in、ostream&out){
多地图数据(按年计算);
字符串str;
while(getline(in,str)){
int year=stoi(str.substr(54,4));
按年份插入数据(组成一对(年份,str));
}
用于(自动v:按年份的数据){
out这一切正常吗?你只是在寻求改进
通常的方法是将所有未排序的行添加到std::vector
,然后使用自定义排序调用std::sort
,以排序到所需的顺序,然后打印出来
应该比您的解决方案(无论如何都很好)更有效。作为使用str.substr(54,4)
的替代方法,您可以使用以下方法(如果格式发生变化,则使用字符位置容易出错):
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
string myString=“三个单独的令牌”;
istringstream iss(myString);
自动it=istream_迭代器(iss);
字符串thirdToken=*(it+++);
cout substr(54,4)的原因因为在文本文件中,生日总是每行的第54-58个字符。到底什么对你不起作用?你问?@P0W可能不是同一个人,只是同一课程的某个人……最近这越来越频繁了,你总能知道什么时候离某所大学的课程作业截止日期还有5个小时……是的,最近在那里是不是也出现了一连串的括号匹配问题
#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;
}