使用标题和cpp从文件中读取

时间:2014-04-20 15:25:53

标签: c++ ifstream

好的,所以我有3级车辆继承树。叶子类(树下的最后一个)是六个。我想创建一个将从.txt文件中读取的函数,然后将信息分配给不同的变量(例如,该文件将包含2006 Toyota Supra Diesel,这些将分配给yearbrandmodelfuel_type)。实际上我设法做到了这一点,但之后当我将代码分成.h和.cpp文件时,函数停止工作。

void Cars::txt_input()
{
    getline(file,input);          //This is in the .cpp file for one of the 
    year = atoi(input.c_str());   //child classes.
    getline(file,input);
    brand = input;
    getline(file,input);
    model = input;
    getline(file,input);
    passenger_capacity = atoi(input.c_str());
    getline(file,input);
    engine_power = atoi(input.c_str());
    getline(file,input);
    max_speed = atoi(input.c_str());    
    getline(file,input);
    fuel_type = input;
    getline(file,input);
    wheel_drive = input;
    getline(file,input);
    average_cons = atoi(input.c_str());
    getline(file,input);
    number_doors = atoi(input.c_str());
    getline(file,input);
    cType = input;
    getline(file,input);
    price = atoi(input.c_str());
}

在我的main()中,我声明了ifstream file("vehicles.txt")string input,在分割代码之前工作正常。另外,我创建了ifstream filestring input变量作为基类的受保护成员,否则它不会编译,因为它没有找到任何文件和输入变量来处理。但是,现在似乎该函数根本不接受来自main()的变量,只是填充所有对象' 0或N / A的字段(根据构造函数。)

for (int i = 0; i < 11; i++)
{
    if(i<4) 
        vehicles.push_back(new Cars());
        vehicles[vehicles.size()-1]->txt_input();
    }
    if(i==4 || i==5)
    {
        vehicles.push_back(new Bus());
        vehicles[vehicles.size()-1]->txt_input();
    }
    //...
}

这就是我在main()中创建对象的方法。正如我所说,当我在Main.cpp中拥有所有代码时,它工作得很好。此外,我尝试将(ifstream file,string input)作为参数传递给txt_input()函数,但它产生错误C2248。这是我的第一篇帖子,对不起,如果有任何歧义。如果需要,我会提供更多代码/信息。

class Vehicles
{
public:

    Vehicles();

    virtual void txt_input();
    virtual void user_input();
    virtual void output();

    void red_output();

    int getPC();
    int getPrice();
    string getBrand();

    void open_file();

protected:
    string brand, model, type;
    int year, passenger_capacity, price;
    double engine_power, max_speed;
    ifstream file;
    string input;
};

这是父类。

2 个答案:

答案 0 :(得分:0)

您已在file中设置变量main,但使用名为file的成员变量,该变量未设置为vehicles.txt。一种方法是使构造函数将文件名作为参数。

E.g。代码 - 未编译 构造

Cars::Cars(const ifstream& if) : file(if) { }

将其添加到矢量时 vehicles.push_back(new Cars(file)); // this is the file defined in main set to "vehicles.txt"

注意:在命名类成员变量(例如mFile,m_file,_file)时使用约定以避免混淆。

答案 1 :(得分:0)

因此,根据评论,问题是您的变量file现在是Vehicles的成员,与您之前的ifstream无关...

以下内容可能有所帮助:

/*virtual*/ void Vehicles::txt_input(std::istream& file)
{
    std::string input;    

    getline(file, input);
    year = atoi(input.c_str());
    getline(file, input);
    brand = input;
    // And so on... 

}

所以你的循环变成了:

std::ifstream file("vehicles.txt");
for (int i = 0; i != 4; i++) {
    Cars* cars = new Cars();
    cars->txt_input(file);
    vehicles.push_back(cars);
}
for (int i = 0; i != 2; i++) {
    Bus* bus = new Bus();
    bus->txt_input(file);
    vehicles.push_back(bus);
}