从向量

时间:2018-05-15 06:59:37

标签: c++ vector fstream

我的任务是将文件中的数据读入矢量:

21000 Landhau Nolte brown
19000 Modern_fit Hoeffner magnolie
14700 Pure_Style Wellmann black

这是我的尝试,但推回不起作用。我已经在Stack Overflow上看了一些例子,但不知怎的,它不起作用。

functions.h

#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;

struct Kitchen {
    double price;
    string name;
    string manufacturer;
    string color;
};

main.cpp

#include "functions.h"

int main(){

    vector<Kitchen> Kitchens;

    fstream myFile;
    myFile.open("kitchen.txt", ios::in);
    if (myFile.is_open()) {
        while (!myFile.eof()) {
            double price;
            string name;
            string manufacturer;
            string color;
            myFile >> price >> name >> manufacturer >> color;
            Kitchens.push_back(price, name, manufacturer, color);

        }

        myFile.close();
    }
    else cout << "not opened." << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

我做错了什么?

4 个答案:

答案 0 :(得分:2)

结构是一种聚合类型,但是为了将struct对象推送到struct的向量中,你必须创建一个,即使它可以是临时的:

#include <iostream>
#include <vector>
using namespace std;
struct Kitchen {
    double price;
    string name;
    string manufacturer;
    string color;
};
int main() {
  std::vector<Kitchen> kt;
  kt.push_back(Kitchen{21000,"Landhau","Nolte","brown"});

 return 0;
}

通过稍微修改并在Kitchen结构中使用参数化构造函数,您可以避免push_back的内部复制/移动操作,并直接使用emplace_back。

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
struct Kitchen {
    double price;
    string name;
    string manufacturer;
    string color;
    Kitchen(double p,
            const string& n,
            const string &m,
            const string &c):price(p),name(n),manufacturer(m),color(c) {}
};
int main(){

    vector<Kitchen> Kitchens;

    fstream myFile;
    myFile.open("kitchen.txt", ios::in);
    if (myFile.is_open()) {
        while (!myFile.eof()) {
            double price;
            string name;
            string manufacturer;
            string color;
            myFile >> price >> name >> manufacturer >> color;
            Kitchens.emplace_back(price, name, manufacturer, color);

        }

        myFile.close();
    }
    else cout << "not opened." << endl;

    system("PAUSE");
    return EXIT_SUCCESS;
}

答案 1 :(得分:1)

你做错了是试图将4个随机变量传递给实际只需要一个的push_back,而那个变量是向量的值类型。

Kitchen k; 
myFile >> k.price >> k.name >> k.manufacturer >> k.color;
Kitchens.push_back(k);

答案 2 :(得分:1)

push_back需要Kitchen。该代码提供了Kitchen的部分。尝试emplace_back或实例化临时Kitchen以传递到push_back

答案 3 :(得分:1)

让我们正确地做到这一点。

从标头开始,不要包含超过该标头中定义所需的内容,也不要将std中的所有标识符导入全局名称空间。

#include <string>

struct Kitchen {
    double price;
    std::string name;
    std::string manufacturer;
    std::string color;

    Kitchen(double price, std::string name,
            std::string manufacturer, std::string color)
        : price{price}, name{name}, manufacturer{manufacturer}, color{color}
    {}
};

我添加了一个简单的构造函数,因为我们稍后需要emplace_back

现在实施main()。对于可重现的示例,最好从字符串流中读取而不是弄乱文件:

#include <vector>
#include <sstream>
#include <iostream>

int main()
{
    std::vector<Kitchen> kitchens;

    std::istringstream file("21000 Landhau Nolte brown\n"
                            "19000 Modern_fit Hoeffner magnolie\n"
                            "14700 Pure_Style Wellmann black\n");

    {
            double price;
            std::string name;
            std::string manufacturer;
            std::string color;
            while (file >> price >> name >> manufacturer >> color) {
                kitchens.emplace_back(price, name, manufacturer, color);
            }
    }

    std::clog << "Read " << kitchens.size() << " kitchens from input\n";
}

请注意!eof()并不能保证读取成功。相反,我们尝试读取,然后测试输入流是否处于故障状态。在循环之后,我们可以(如果我们想要的话)实际检查我们是否到达文件末尾,而不是某些失败条件 - 我已经省略了这个简单的程序。