假设我有一个像这样的几行文本文件
H 2012/08/05 20 13 Homework 1
Q 2012/08/07 10 8.5 Quiz 1
L 2012/08/05 5 3 Lab 1 Attendance
开头的字母代表(H)家庭作业,(Q或E)测验/考试,以及(L)实验室 我想将每个值读入相应的类变量,然后按字母顺序对它们进行排序,然后将它们打印到自己的类别中: 这是我设置的课程。
class Assignment
{
private:
char Assignment_type;
string Date;
int Max_score;
float Actual_score;
string Assignment_name;
public:
Assignment();
}
显然我还没有编写函数来返回值或默认构造函数,我真的只需要帮助找出如何从文件中读取正确的变量。
一旦读入,我需要能够按字母顺序对它们进行排序,然后再将它们打印到相应的类别中。
如何在将这些数据读入正确的变量后按字母顺序排序?
答案 0 :(得分:3)
您可以使用std::getline
和std::istringstream
以及其他一些标准库功能来执行此操作:
class Assignment
{
// ...
public:
friend std::istream& operator>>(std::istream& is, Assignment& assignment)
{
std::string line;
std::getline(is, line);
std::istringstream iss(line);
iss >> assignment.Assignment_type;
iss >> assignment.Date;
iss >> assignment.Max_score;
iss >> assignment.Actual_score;
// The last field is a little difficult, as it should get the rest
// of the line, which can include spaces, and the `>>` operator
// separates on spaces
// Get the rest using `getline`
std::getline(iss, assignment.Assignment_name);
return is;
}
};
现在你可以做到。
std::ifstream input_file("data.txt");
Assignment assignment;
input_file >> assignment;
参考文献:
对于另一部分,您应该将新读取的Assigment
对象放在像std::vector
这样的集合中。然后,您可以使用std::sort
对它们进行排序:
std::vector<Assignment> assignments;
std::ifstream input_file("data.txt");
Assignment assignment;
while (input_file >> assignment)
assignments.push_back(assignment);
std::sort(std::begin(assignments), std::end(assignments));
要使std::sort
功能起作用,您必须为您的作业实施operator<
:
class Assignment
{
// ...
public:
friend bool operator<(const Assignment& a, const Assignment& b)
{
return a.Assignment_name < b.Assignment_name;
}
};
如果你有一个C ++ 11(或更好)兼容的编译器,那么你可以在调用std::sort
时使用lambda expressions(另见Wikipedia):
std::sort(std::begin(assignments), std::end(assignments),
[](const Assignment& a, const Assignment& b)
{
return a.Assignment_name < b.Assignment_name;
});
参考文献:
答案 1 :(得分:1)
要阅读您的数据,您似乎应该做正常的事情
std::istream& operator>>(std::istream& in, Assignment& a)
{
in >> a.Assignment_Type >> a.Date >> a.Max_score >> a.Actual_score;
getline(in, a.Assignment_name);
return in;
}
唯一有点棘手的部分是你的作业名称可以包含空格,所以我使用了getline来阅读那部分。
此功能必须是Assignment的朋友才能访问其私有变量。
class Assignment
{
friend std::istream& operator>>(std::istream& in, Assignment& a);
...
};
至于数据排序,只需将其放入向量中并使用合适的排序条件调用std::sort
。
bool compare(const Assignment& x, const Assignment& y)
{
return ...; // return true if x is 'less than' y alphabetically
}
std::vector<Assignment> data;
...
std::sort(data.begin(), data.end(), compare);
答案 2 :(得分:0)
你应该做类似跟随的事情,并将每个标记存储在相应的类变量中。
char buff[50]; char *temp;
while(in.getline(buff,50,'\n'))
{
Asignment_type = strtok(buff," ");
int count = 4;
while(count>0)
{
temp = strtok(NULL," ");
count--;
}
}
第一个令牌将为您提供作业类型,而在内部时,每个临时将为您提供每行的进一步令牌。您可以将它们存储在相应的变量中。 (想想你将如何存储完整的作业名称)。祝你好运。