use*_*892 2 c++ sorting string split stream
我有一个包含一堆数据的文本文件,它实际上是一个学生列表。
结构如下:“姓名”“电话”“性别”“学生号”“邮箱”
这是列表的示例:
Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu
数据存储在文本文件中,我已经使用 getline() 函数将每一行转换为字符串。
即:student[0] 包含“Roger Pont 7077874567 M 20120345 hills@school.edu”
我的任务是根据 StudentID 按升序对记录进行排序。
我的问题是我想将字符串拆分为不同的变量类型。
但是,由于某些名称之间有更多空格并且电话号码由不同长度组成,因此我不能以这种方式使用输入和输出流:
stream >> name[i] >> tel[i] >> sex[i] >> StudentID[i] >> email[i];
任何想法如何将字符串拆分为不同的变量?
提前致谢。
备注:我读过这个(在 C++ 中将字符串拆分为多个变量),但与那种情况不同,我没有特定的模式,例如在表示年龄的整数之前有“年龄”一词。
Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu
Run Code Online (Sandbox Code Playgroud)
看上面的数据,如果我们把每一行逆向处理,那么问题就变得很简单了:
N。words[N-1]=> 电子邮件地址words[N-2]=> student id。这给了你足够的提示。
#include <iostream>
#include <sstream>
#include <vector>
#include <string>
#include <iterator>
#include <cassert>
struct student
{
std::string name;
std::string phone;
std::string gender;
std::string student_id;
std::string email;
};
int main()
{
std::vector<student> students;
std::string line;
while(std::getline(std::cin, line))
{
std::istringstream ss(line);
std::istream_iterator<std::string> begin(ss), end;
std::vector<std::string> words(begin, end);
assert(words.size() >= 5);
int n = words.size() - 1;
student s { words[0], words[n-3], words[n-2], words[n-1], words[n] };
for (int i = 1 ; i < n - 3 ; i++) s.name += " " + words[i];
students.push_back(s);
}
//printing
for(auto && s : students)
std::cout << "name = " << s.name << "\n"
<< "phone = " << s.phone << "\n"
<< "gender = " << s.gender << "\n"
<< "student_id = " << s.student_id << "\n"
<< "email = " << s.email << "\n\n";
}
Run Code Online (Sandbox Code Playgroud)
Roger Pont 70778745 M 20120345 hills@school.edu
Tommy Holness 5127438973 M 20120212 tommy@school.edu
Lee Kin Fong 864564456434 F 30245678 fong@school.edu
Run Code Online (Sandbox Code Playgroud)
name = Roger Pont
phone = 70778745
gender = M
student_id = 20120345
email = hills@school.edu
name = Tommy Holness
phone = 5127438973
gender = M
student_id = 20120212
email = tommy@school.edu
name = Lee Kin Fong
phone = 864564456434
gender = F
student_id = 30245678
email = fong@school.edu
Run Code Online (Sandbox Code Playgroud)
现在花一些时间来理解代码。我向您展示的代码是使用 C++11 编写的。它展示了现代 C++ 的许多习语。
希望有帮助。
| 归档时间: |
|
| 查看次数: |
13864 次 |
| 最近记录: |