2

次のようなクラスがあります。

class Test
{
public:
    Test() {}
    ~Test() {}

    //I kept these public for simplicity's sake at this point (stead of setters).
    int first_field;
    int second_field;
    int third_field;
    string name;
};

私の .txt ファイルは次のようになります。

1  2323   88   Test Name A1
2  23432  70   Test Name A2
3  123    67   Test Name B1
4  2332   100  Test Name B2
5  2141   98   Test Name C1
7  2133   12   Test Name C2

ファイルの各行をベクトルに読み込めるようにしたいので、現在のコードは次のようになります。

#include "Test.h"
#include <fstream>
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    ifstream file;
    vector<Test> test_vec;

    file.open("test.txt");
    if(file.fail())
    {
        cout << "ERROR: Cannot open the file." << endl;
        exit(0);
    }

    while(!file.eof())
    {
        string input;
        if(file.peek() != '\n' && !file.eof())
        {
            Test test;

            file >> test.first_field >> test.second_field >> test.third_field;
            getline(file, input);
            test.name = input;

            test_vec.push_back(test);
        }
    }

    return 0;
}

だから、そのデータを読みたい部分で立ち往生しています...入力ストリーム演算子を試しましたが、何もしません。他のオプションではエラーが発生します。可能であれば、フォーマットも保持したいと思います。後でやりたいことは、そのベクトルをクラス内のさまざまなデータ フィールドでソートできるようにすることです。

何か案は?

編集: 問題は解決され、それを反映するようにコードが編集されました。助けてくれてありがとう。:)

4

2 に答える 2

1

tacpの答えは良いですが、C++/STLのより慣用的なものと私が考える2つのことを次に示します。

使用するoperator >>

istream & operator>>(istream &in, Test &t)
{
  in >> t.first_field >> t.second_field >> t.third_field;
  getline(in, t.name);
  return in;
}

その時点で、ファイルの読み取りは次のようになります

ifstream file("test.txt");
vector<Test> tests;
Test test;
while(file >> test) {
  tests.push_back(test);
}

streamiterator/iterator コンストラクターを使用する

それを超STL慣用的にするために、使用してistream_iterator(忘れないでください)、イテレータから#include<iterator>を構築します:vector

ifstream file("test.txt");
istream_iterator<Test> file_it(file), eos;
vector<Test> tests(file_it, eos);

PS: サンプル入力を備えた単純なサンプル コードの Noobacode に賛成票を投じました。とはいえ、他の人がこの質問に出くわした場合に、元の問題が何であったかを理解しやすくするために、元のコードをそのままにしておいた方が個人的には好まれました。

于 2013-05-06T02:16:58.243 に答える