0

我正在尝试更多地了解向量并在其中存储对象。我正在从 txt 文件中读取数据。我看不出我犯了什么错误,它不起作用。

这是我的主要方法

void Reader::readFoodFile() {
    string name;
    int cal, cost;
    ifstream file;
    file.open("food.txt");
    while (file >> name >> cal >> cost) {
        Food f(name, cal, cost);
        foodStorage.push_back(f); 

    } 
}
void Reader::getStorage() {
    for (unsigned int i = 0; i < foodStorage.size(); i++) {
        cout << foodStorage[i].getName();
    }
}

这是我的 Food 构造函数:

Food::Food(string newName, int newCalories, int newCost) {
    this->name = newName;
    this->calories = newCalories;
    this->cost = newCost;
}

在我的 main.cpp 文件中,我只是创建对象 Reader(现在没有构造函数)并调用方法。

int main(int argc, char** argv) {

        Reader reader;
        reader.readFoodFile();
        reader.getStorage();
}

我想用从 txt 文件中获取数据的对象填充向量,然后将其打印出来(现在)。

有什么建议么?

编辑; 我的 .txt 文件布局是

apple 4 2
strawberry 2 3
carrot 2 2

这是我的 Food.h 和 Reader.h

#ifndef FOOD_H
#define FOOD_H

#include <string> 
#include <fstream>
#include <iostream>

using namespace std;

class Food {
public:
    Food();
    Food(string, int, int);
    Food(const Food& orig);
    virtual ~Food();
    string getName();
    int getCalories();
    int getCost();
    void setCost(int);
    void setCalories(int);
    void setName(string);
    int calories, cost;
    string name;
private:

};

#endif  /* FOOD_H */`

and Reader.h
`#ifndef READER_H
#define READER_H
#include <string> 
#include <fstream>
#include <iostream>
#include <vector>
#include "Food.h"

using namespace std;

class Reader {
public:
    Reader();
    Reader(const Reader& orig);
    virtual ~Reader();

    void readFoodFile();
    void getStorage();
    vector<Food> foodStorage;

private:

};

#endif  /* READER_H */
4

2 回答 2

0

我猜你的 exe 运行的相对路径与你期望的不同。调用 file.open() 后检查 file.good() 是否为真。当编程 IDE(例如 Visual Studio)使用与正在编写 exe 的位置不同的工作文件夹运行 exe 时,此问题很常见。

于 2013-05-02T02:02:53.950 回答
0

我刚刚编译了你的代码,它对我来说很好......我使用了 g++......你需要修复的东西......

  1. 摆脱您在 .h 文件中但未在 .cpp 中定义的构造函数
  2. 给出 getName 的实现。

以下是我的代码:

食物.h

#ifndef FOOD_H 
#define FOOD_H

#include <string> 
#include <fstream> 
#include <iostream>

using namespace std;

class Food { public:
    //Food();
    Food(string, int, int);
    //Food(const Food& orig);
    //virtual ~Food();
    string getName();
    int getCalories();
    int getCost();
    void setCost(int);
    void setCalories(int);
    void setName(string);
    int calories, cost;
    string name; private:

};

#endif

食物.cpp

#include<iostream> 
#include<string> 
#include "food.h" 
using namespace std; 
 Food::Food(string newName, int newCalories, int newCost) {
    this->name = newName;
    this->calories = newCalories;
    this->cost = newCost; } string Food::getName() {
        return name; }

读者.h

#ifndef READER_H 
#define READER_H 
#include <string> 
#include <fstream> 
#include <iostream> 
#include <vector> 
#include "food.h"

    using namespace std;

    class Reader { public:
        //Reader();
        //Reader(const Reader& orig);
        //virtual ~Reader();

        void readFoodFile();
        void getStorage();
        vector<Food> foodStorage;

    private:

    };

    #endif

阅读器.cpp

#include <iostream> 
#include "reader.h"

using namespace std; void Reader::readFoodFile() {
    string name;
    int cal, cost;
    ifstream file;
    file.open("food.txt");
    while (file >> name >> cal >> cost) {
        Food f(name, cal, cost);
        foodStorage.push_back(f);

    } } void Reader::getStorage() {
    for (unsigned int i = 0; i < foodStorage.size(); i++) {
        cout << foodStorage[i].getName();
    } }

主文件

#include<iostream>
#include<fstream>
#include "food.h"
#include "reader.h"

using namespace std;

int main(int argc, char** argv) {
        Reader reader;
        reader.readFoodFile();
        reader.getStorage();
}

我使用--编译 g++ main.cpp reader.cpp food.cpp

我得到的输出——applestrawberrycarrots

所以,我不确定你错过了什么......希望这会有所帮助

我没有添加std::endl.. 如果你在你拥有的地方添加了,std::cout那么每个项目都将在自己的行中。此外,您应该close在使用完流后播放它。

于 2013-05-02T02:10:47.543 回答