读取输入以构造对象

时间:2016-02-27 10:33:45

标签: c++ object stream

我正在尝试读取一个字符串行,用于排列.txt文件,以便使用带有字符串的构造函数启动一个对象数组。

文本文件写成

TransAm
Mustang
Corvette

我觉得我的循环没有迭代我想要正确设置的信息。有没有一种简单的方法来实现这一目标? main.cc

    #include <string>
    #include <iostream>
    #include "Car.cc"
    #include <fstream>
    using namespace std;

    int main()
    {

        Car cars[3];


        string STRING;
        ifstream infile;
        infile.open("cars.txt");

// THIS IS HOW IT'S ACHIEVED USING FOR-LOOP - Sam

for(int i = 0; i<3 && infile;++i){
            getline(infile,STRING);
            cars[i].setName(STRING);
    }


/* THIS IS WHAT I HAD
        while(!infile)
        {
            getline(infile,STRING);
            for(int i = 0; i<sizeof(cars);i++){
                cars[i].setName(STRING);
            }
        }
  */  
        infile.close();
        for(int j = 0;j<sizeof(cars);j++){
            cars[j].print();
        }

    }

Car.h

#include <string>


using namespace std;

class Car{

public:
    Car();
    Car(string);
    string getName();
    void setName(string);
    void print();

private:
    string name;
};

Car.cc

#include <string>
#include "Car.h"

using namespace std;

 Car::Car()
 {

 }

 Car::Car(string s)
{
     setName(s);
}

void Car::setName(string s)
{
    name = s;
}

string Car::getName()
{
    return name;
}

void Car::print()
{
    cout << name;
}

3 个答案:

答案 0 :(得分:1)

这些要点需要纠正:

  1. while (!infile)阻止您进入循环。
  2. 您不需要两个循环。
  3. 您可以像这样修改循环:

    for (int i = 0; i < sizeof(cars) && getline(infile, STRING); ++i)
        cars[i].setName(STRING);
    

    或者像这样:

    for (int i = 0; i < sizeof(cars) && infile; ++i) {
        getline(infile, STRING);
        cars[i].setName(STRING);
    }
    

答案 1 :(得分:1)

正如所说,“改变while(!infile)to while(getline(infile,STRING))”但不要忘记删除getline(infile,STRING);之后。

答案 2 :(得分:1)

如果文件正确打开,你的循环暂时没有。只有在打开电话不成功时才会进入。

将循环更改为

while (getline(infile,STRING))
{
    //...
}

while (infile)
{
    //...
}