3

このようにフォーマットされたデータファイルから読み取る必要があります

abcd(文字列) 1(整数) 2(整数) 3(整数)
abcde(文字列) 4(整数) 3(整数) 2(整数)
.
.
.

同じ行でのみ変数を使用するいくつかの機能を実行したいと考えています。しかし、ここに私のコードがあります。初心者なので訂正よろしくお願いします。

.h ファイル内

#include <string>
using namespace std;


#ifndef CALC_H  
#define CALC_H


class Calc  
{  
public:

    void readFile(string file);

private:

    string name;
    int a;
    int b;
    int c;
};

#endif

実装ファイルで

 #include "Vehicle.h"  
 #include iostream>  
 #include fstream>  
 #include string>  
 #include cstdlib>  
 #include cmath>  

 using namespace std;


void Vehicle::readFile(string filename)  
{  
   ifstream myIn;  

 int totalNum=0;  

myIn.open(filename.c_str());
if (!myIn)
{
    cerr<<"Data file failed to open!\n";
    exit (0);
}   
for (int i=0; i<MAX; i++)
{
    while (myIn.peek() != EOF)
    {
        myIn>>calc[i].name;
        myIn>>calc[i].a;
        myIn>>calc[i].b;
        myIn>>calc[i].c;

        totalNum++;
    }
}
myIN.close();

そして、ファイルから読み取ったものを表示したい

 for (int i = 0; i < MAX; i++)  
 cout << calc[i].name << calc[i].a << calc[i].b << calc[i].c << endl;

申し訳ありませんが、私が正しい道を進んでいるかどうかを知りたいだけです。ありがとう

4

2 に答える 2

2

>>これを行う適切な方法は、クラスの演算子をオーバーロードすることCalcです。

class Calc {
   public:
      friend istream& operator >>(istream& myIn, Calc& calc);
};

istream& operator >>(istream& myIn, Calc& calc) {
    myIn >> calc.name;
    myIn >> calc.a;
    myIn >> calc.b;
    myIn >> calc.c;

    return myIn;     
}

これで、次のことができます。

while (myIn >> calc[i]) {
    ++totalNum;
}
于 2013-03-20T20:55:42.507 に答える
0

少し違ったデザインを検討する必要があります。

1行を保持するクラス、つまりstring int int intを作成します。これは、「Calc」の場合と同じですが、行の作成方法(readfile)に依存することはありません。それを「ライン」と呼びましょう

class Line
{
public:
  std::string name;
  int a;
  int b;
  int c;  
};

ここで、いくつかの行を読み取る必要があるため、それらを保持するために何らかのコンテナが必要になります。Line(または他のコンテナ)のベクトルを作成します。

std::vector<Line> contents;

次に、Tusharが提案したように、ストリーム演算子をオーバーライドします。これにより、ファイルから(またはstdinなどから)読み取るときに、読み取る行ごとにLineのインスタンスを作成できます。これらのインスタンスは、「contents」配列を埋めるために使用します。

これで、ラインでやりたいこと、つまり実際の操作を開始できます。calc

于 2013-03-20T22:10:13.607 に答える