0

次のようにデータを保存したテキストファイル「test.txt」があります。各区切り文字フィールドの間にスペースがあります。

コード:名前:Coy

045: Ted: Coy1
054: Red: Coy2

このデータをファイルから読み取り、ベクターに挿入するにはどうすればよいですか?

vector <Machine> data;
Machine machine

void testclass(){
ifstream inFile("test.txt");
if (!inFile){
    cout << "File couldn't be opened." << endl;
    return;
}
while(!inFile.eof()){
    string code,name,coy;
    getline(inFile,code, ':');
    getline(inFile,name, ':');
    getline(inFile,coy, ':');
data.push_back(machine)

}

しかし、データのプッシュに問題があるようです

4

2 に答える 2

1

他の人がすでに指摘しているように、問題の 1 つは、データをローカル変数 ( codenameおよび) に読み込んでいるが、それらの値をベクトルに追加する前にcoyそれらの値を決して入れないことです。machine

しかし、それだけが問題ではありません。あなたも間違っています(実際、本質的に常に間違っています)。あなたが通常やりたいことは、読み取りが成功している間に読み取りを続けることです。読み取りを実行しようとして、読み取りが開始される前にファイルの最後に到達した場合にのみ true を返します。while (!infile.eof())while (!whatever.eof())whatever.eof()

私が通常修正する方法は、Machine クラスのストリーム エクストラクタを定義することです。

class Machine { 
// ...

    friend std::istream &operator>>(std::istream &is, Machine &m) { 
        std::getline(is, m.code, ':');
        std::getline(is, m.name, ':');
        std::getline(is, m.coy, ":");
        return is;
    }
};

これを使用すると、次のような読み取りを行うことができます。

std::vector<Machine> machines;

Machine machine;

while (infile >> machine) 
    machines.push_back(machine);

型のストリーム エクストラクタを定義したら、考慮すべき別の可能性もあります。イテレータのペアからベクトルを初期化できます。

std::vector<Machine> machines((std::istream_iterator<Machine>(infile)),
                               std::istream_iterator<Machine>());

...そして、ファイルからすべてのデータを読み取り (operator>>上で定義した を使用)、それを使用してmachinesベクトルを初期化します。

于 2013-01-27T07:33:21.187 に答える
0

データを読み取り、それらを Machine クラスのオブジェクトのメンバー変数に入れる必要があります。次に、そのオブジェクトをベクターに配置します。

于 2013-01-27T07:04:01.320 に答える