-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::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::sorta を実装する必要があります。operator<

class Assignment
{
    // ...

public:

    friend bool operator<(const Assignment& a, const Assignment& b)
    {
        return a.Assignment_name < b.Assignment_name;
    }
};

C++11 (またはそれ以上) と互換性のあるコンパイラを使用している場合は、次の呼び出し時にラムダ式を使用できます ( Wikipediaも参照) std::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 を使用してその部分を読み取りました。

この関数は、プライベート変数にアクセスするために代入のフレンドである必要があります。

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 に答える