-1

假设我有一个像这样的多行文本文件

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

显然我还没有编写函数来返回值或默认构造函数,我真的只需要一些帮助来弄清楚如何首先从文件中读取到正确的变量。

读入后,我需要能够按字母顺序对它们进行排序,然后再将它们打印到相应的类别中。

将此类数据读入正确的变量后,如何按字母顺序对其进行排序?

4

3 回答 3

4

您可以使用std::getlinestd::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(或更好)兼容的编译器,那么您可以在调用时使用lambda 表达式(另见Wikipediastd::sort ) :

std::sort(std::begin(assignments), std::end(assignments),
    [](const Assignment& a, const Assignment& b)
    {
        return a.Assignment_name < b.Assignment_name;
    });

参考:

于 2013-09-27T06:13:01.527 回答
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);
于 2013-09-27T06:10:02.177 回答
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--;

        }

    }

第一个令牌会给你分配类型,在内部,每个临时都会给你更多的令牌,每行。您可以将它们存储在相应的变量中。(想想你将如何存储完整的作业名称)。祝你好运。

于 2013-09-27T06:21:16.190 回答