1

これを含むデータテキストファイルがあります

Map2D, [3, 2]
Dot3D, [25, -69, -33], [-2, -41, 58]
Map3D, [6, 9, -50]
Map2D, [3, 2]
Dot3D, [7, -12, 3], [9, 13, 68]
Map3D, [6, 9, 5]
Map2D, [3, 2]
Dot3D, [70, -120, -3], [-29, 1, 268]
Dot3D, [7, 12, 3], [-9, 13, 68]
Map3D, [1, 3, 8]
Dot2D, [5, 7], [3, 8]

基本的にテキストファイルの最初のデータは、私が取得したクラス名です 4 クラス

Map2D
Map3D
Dot2D
Dot3D

私のプログラムが上記のデータを抽出し、4つのクラスのそれぞれについて抽出演算子>>をオーバーロードし、それを関連するオブジェクトに格納できるように、独自のファイルマニピュレータを作成しようとしていました。

vector 、 map 、 set 、または list を store に使用することを考えていました。しかし、このために、クラスの関連オブジェクトに保存するなど、やりたいことをどのように達成しますか。

私は独自のファイルマニピュレーターを作成する方法についてグーグルで調べてみましたが、誰かがサンプルコードを見せてくれれば良いでしょう。おそらくテストファイルでコンパイルして実行し、出力を自分で観察できます。iomanip を使用して >> 演算子をオーバーロードしたい

次のようなものを作成する必要があるため、マニピュレーターを使用する必要があります

私は何かをする必要があります

cout << "Input File Name";
cin >> readFile;

すべてのデータの読み取りとオブジェクトの作成を実行します

ご迷惑をおかけしましたことをお詫び申し上げます。次に、レコードを 1 行ずつ読み取り、クラスとその中のデータを作成します。

ご助力いただきありがとうございます!

4

2 に答える 2

4

を使用した例std::cinです。で問題なく動作するはずfstreamです。入力の解析は本当に厄介です。入力から括弧 ("[" amd "]") を削除することは可能ですか?

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <c>

class Map2D {
    std::vector<int> values;
public:
    friend std::istream& operator>>(std::istream& in, Map2D m) {
        std::string i;
        in >> i;
        std::stringstream ss(i);
        std::getline(ss, i, '[');
        std::getline(ss, i, ',');
        ss >> i;
        std::cout << i << std::endl;
        in >> i;
        ss.str("");
        ss << i;
        i = i.substr(0, i.size()-1);
        ss >> i;
        std::cout << i << std::endl;;
    }
};

int main() {
    std::string type, file_name;
    std::cout << "Input File Name";
    std::cin >> file_name;
    std::fstream file(file_name.c_str());
    Map2D m;
    while (std::getline(std::cin, type, ',')) {
        if(type.find("Map2D") != std::string::npos) {
            file >> m;
        }
    }
}
于 2012-11-12T19:38:26.207 に答える
3

を使用しcinてファイル名を取得できますが、ファイルを解析できるヘルパーメソッドを作成する必要があります。

私の提案は、DataMembersまたはそのようなものと呼ばれるクラスを作成することです。そのクラスでは、データメンバーファイルを読み込むヘルパーメソッドを使用できます。クラスには、ファイルから読み取ったデータを格納するための4つのベクトルを含めることができます。

class DataMembers
{
    private:
        std::vector<Map2D> _map2Ds;
        std::vector<Map3D> _map3Ds;
        ....
    public:
        void readDataFile(std::string inFileName);
        void writeDataFile(std::string outFileName);
};

readDataFileメソッドは次のことを行う必要があります

  1. 一度に1行ずつファイルを読みます
  2. 行を解析して、作成するオブジェクトタイプを決定します(タイプが認識されない場合はエラーになります)
  3. 行に、示されたタイプの正しいデータが含まれていることを確認します
  4. 適切なタイプのオブジェクトを作成します
  5. オブジェクトを適切なオブジェクトコレクションに割り当てます

データ型の作成と適切なコレクションへの割り当てを処理するために、他のプライベートメソッドを作成することをお勧めします。

于 2012-11-12T19:10:13.930 に答える