0

Ok。そのため、ファイルから読み取り、情報をクラスに入れようとしています。説明させてください:

このようなtxtファイルがあるとしましょう

1 2 3 4
5 6 7 8

今、私はクラスを持っているとしましょう

class Numbers {
public:
    Numbers(int first, int second, int third, int fourth)
    : first(first), second(second), third(third), fourth(fourth){}

private:
    int first;
    int second;
    int third;
    int fourth;
};

ここで、ファイルの各行を Numbers の新しいインスタンスにし、各行の数値を各インスタンスのデータ メンバーとして使用したいと考えています (これは理にかなっていると思います)。

したがって、上記のファイルを読み取った後、Numbers の 2 つのインスタンスが必要です。最初のものは (1, 2, 3, 4) を含み、2 番目のものは (5, 6, 7, 8) を含みます。ファイルから読み取った後、文字列を int に変換する関数があります。ほとんどの場合、Numbers のインスタンスの作成に問題があります。何か案は?

4

3 に答える 3

2

このように、すべての数値をベクトルにロードしてみませんか?

#include <iterator>
#include <fstream>
#include <vector>
#include <iostream>

std::vector<int> loadNumbersFromFile(const std::string& name)
{
    std::ifstream is(name.c_str());
    if (!is)
    {
        std::cout << "File could not be opened!" << std::endl;
    }
    std::istream_iterator<int> start(is), end;
    return std::vector<int>(start, end);
}

void main()
{
    std::vector<int> numbers = loadNumbersFromFile("file.txt");
}

そのためのクラスを宣言する必要はありません。

于 2013-11-03T20:03:34.900 に答える
0

basic_istream& operator>>(int&)すでにこれを行っているため、何も変換する必要はありません

ifstream f;
f >> first;

インスタンスの作成はNumbers、コンストラクタを定義するのと同じくらい簡単です

Numbers() : first(0), second(0), third(0), fourth(0) {}

その後

Numbers number1, number2;

そして、あなたが定義するとき

friend istream &operator>>(istream &f, Number &n) {
    f >> n.first >> n.second >> n.third >> n.fourth;
    return f;
}

あなたはただ言うことができます

f >> number1 >> number2;
于 2013-11-03T19:54:21.483 に答える
0

他の人が指摘したように、入力演算子 for はintすでに数字のシーケンスからint. ただし、この変換は、正しいことである場合とそうでない場合があることも実行します。書式設定された入力演算子は、さまざまな種類の空白を区別せずに、先頭の空白をスキップします。つまり、1 行に含まれる値が予想よりも少ない場合、ストリームは喜んで次の行から値を読み取ります! これが正しい動作であるかどうかは、正確な使用法に依存します。質問では、各行に 4 つの値を含む形式が具体的に言及されているため、各行に 4 つ未満の値を含めることは問題あると想定します。

入力演算子が空白を自動的にスキップしないようにするには、 を使用しstd::noskipwsます。ただし、これが適用されると、空白を明示的にスキップする必要があります。カスタムマニピュレータを使用すると、空白をスキップできますが、改行は実行できません。

std::istream& skipspace(std::istream& in) {
    std::istream::sentry cerberos(in);
    if (in) {
        std::istreambuf_iterator<char> it(in), end;
        while (it != end
               && *it != '\n'
               && std::isspace(static_cast<unsigned char>(*it))) {
            ++it;
        }
    }
    return in;
}

このようなマニピュレータを使用すると、値の行の読み取りを実装し、十分な値がない場合に失敗するのはかなり簡単です。

  1. 空白の自動スキップをオフにします。
  2. を使用して先頭の空白をスキップしstd::ws、前の行末と行の先頭の空白を取り除きます。
  3. オブジェクト間の非改行のみをスキップして、各値を読み取ります。

つまり、クラスの入力演算子は次のNumbersようになります。

std::istream& operator>> (std::istream& in, Numbers& numbers) {
    int first, second, third, fourth;
    if (in >> std::noskipws
        >> std::ws >> first
        >> skipspace >> second
        >> skipspace >> third
        >> skipspace >> fourth) {
        numbers = Numbers(first, second, third, fourth);
    }
    return in;
}
于 2013-11-03T20:28:23.260 に答える