3

我必须从格式如下的数据文件中读取

abcd(string) 1(int) 2(int) 3(int)
abcde(string) 4(int) 3(int) 2(int)

.
.

我想执行一些仅在同一行中使用变量的函数。但这是我的代码。我是初学者,请指正,谢谢。

在 .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

你应该考虑设计它有点不同。

创建一个包含一行的类,即 string int int int - 就像您在“Calc”中拥有它一样,但不依赖于您如何创建一行(readfile)。让我们称之为“线”

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

现在,由于您需要阅读几行,您将需要某种容器来保存它们,创建一个 Line 向量(或其他一些容器)

std::vector<Line> contents;

然后按照 Tushar 的建议覆盖流运算符,因此当您从文件(或从例如标准输入)读取时,您可以为读取的每一行创建 Line 实例,这些实例用于填充“内容”数组

现在你可以开始做任何你想做的事情,即实际操作calc

于 2013-03-20T22:10:13.607 回答