C ++将文件读入类变量```

时间:2013-09-27 06:05:19

标签: c++ class variables

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

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

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

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

如何在将这些数据读入正确的变量后按字母顺序排序?

3 个答案:

答案 0 :(得分:3)

您可以使用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(或更好)兼容的编译器,那么你可以在调用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--;

        }

    }

第一个令牌将为您提供作业类型,而在内部时,每个临时将为您提供每行的进一步令牌。您可以将它们存储在相应的变量中。 (想想你将如何存储完整的作业名称)。祝你好运。