将文件读入对象数组 C++

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;

抱歉,我漏掉了很多东西,我只想知道我是否走在正确的道路上。谢谢。


最好使用 while (myIn >> calc[i].name >> calc[i].a >> calc[i].b >> calc[i].c) {totalNum++;} - chris
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;
}

嗯,这有点危险,因为它可能会在中途失败,但我不知道是否可以接受以及如何改进它。 - Alex Chamberlain
@AlexChamberlain 显然OP必须考虑到这一点...这只是一个基本的输入/输出提示。 - Tushar
谢谢。抱歉,我甚至还不能投票。但是这个可以用于对象数组吗?我可以添加一个循环并从第一行读取,例如calc[i].name然后calc[i].a吗? - Jason Lee
@JasonLee 这将读取整个 Calc 对象并抽象/隐藏它的实现方式,这样你就不必每次使用它时都担心重新编码。在我上面发布的 while 循环中,这将读取一个 Calc 对象数组。但要小心始终读取边界内的内容。 - Tushar

0
你应该考虑稍微改变一下设计。
创建一个类来保存一行,例如 string int int int - 就像你在 "Calc" 中所做的那样,但不要让它依赖于如何创建一行(readfile)。我们称之为 "Line"。
class Line
{
public:
  std::string name;
  int a;
  int b;
  int c;  
};

现在,由于您需要读取多行,您需要一些容器来保存它们,创建一个 Line 的向量(或其他容器)。
std::vector<Line> contents;

然后按照Tushar的建议重写流操作符,这样当你从文件(或者标准输入)读取时,你可以为每一行创建Line的实例,然后使用这些实例来填充'contents'数组

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


还是我可以在客户端的main.cc中创建一个循环,只读取一行并执行一些函数,然后重复吗?你会怎么做呢? - Jason Lee
有很多方法可以处理这个问题,你也可以像你说的那样,在不存储任何内容的情况下读入数据并进行计算。 - AndersK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接