-1

这是我需要阅读的文件。

Coca-Cola,0.75,20
Root Beer,0.75,20
Sprite,0.75,20
Spring Water,0.80,20
Apple Juice,0.95,20

我需要将其中的每一个都放入一个变量中。例如drinkName、drinkCost、drinkQuantity。我正在使用c ++,请帮助我。

4

3 回答 3

6

我建议将这三个变量捆绑到一个数据类型中。让我们称之为“DrinkT”。

struct DrinkT{
    std::string name;
    float cost;
    unsigned int quantity;

    DrinkT(std::string const& nameIn, float const& costIn, unsigned int const& quantityIn):
    name(nameIn),
    cost(costIn),
    quantity(quantityIn)
    {}
};

这有很多优点。
您现在可以像这样制作饮品:

DrinkT coke("Coca-Cola",0.75,20);

并像这样访问变量:

std::cout << coke.name << std::endl;     //outputs: Coca-Cola
std::cout << coke.cost << std::endl;     //outputs: 0.75
std::cout << coke.quantity << std::endl; //outputs: 20

饮料对象将只包含您指定的内容:饮料名称、饮料成本和饮料数量。
该对象有一个构造函数,它在构造时采用所有这三个值。
这意味着,您只能在同时指定所有值的情况下创建一个饮料对象。

如果您要存放很多饮料物品(您可能不知道有多少),我们可能还想将它们放入某种容器中。
向量是一个不错的选择。一个向量将增长到可以存储尽可能多的饮料。

让我们遍历文件,分别读取三个值,并将它们存储在我们的向量中。我们将为每种饮料一次又一次地这样做,直到我们到达文件的末尾。

int main(){

    std::ifstream infile("file.txt");
    std::vector<DrinkT> drinks;

    std::string name;
    std::string cost;
    std::string quantity;

    std::getline(infile,name,',');
    std::getline(infile,cost,',');
    std::getline(infile,quantity,' ');

    while (infile){
        drinks.push_back(DrinkT(name,atof(cost.c_str()),atoi(quantity.c_str())));

        std::getline(infile,name,',');
        std::getline(infile,cost,',');
        std::getline(infile,quantity,' ');
    }


    //output
    for(DrinkT drink : drinks){
        std::cout << drink.name << " " << drink.cost << " " << drink.quantity << std::endl;
    }

    return EXIT_SUCCESS;
}

用 g++ -std=c++0x -o main main.cpp 编译

有关使用的一些语言功能的信息:
http ://www.cplusplus.com/reference/string/getline/
http://www.cplusplus.com/reference/stl/vector/

于 2012-04-22T22:57:03.163 回答
3

在某些(但绝对不是全部)方面,我的建议与@Xploit 的建议大致相似。我将首先定义一个结构(或类,如果您愿意)来保存数据:

struct soft_drink { 
    std::string name;
    double price;
    int quantity;
};

然后(一个主要区别)我会operator>>为那个类/结构定义:

std::istream &operator>>(std::istream &is, soft_drink &s) { 
    // this will read *one* "record" from the file:

    // first read the raw data:
    std::string raw_data;
    std::getline(raw_data, is);
    if (!is)
        return is; // if we failed to read raw data, just return.        

    // then split it into fields:
    std::istringstream buffer(raw_data);

    std::string name;
    std::getline(buffer, name, ',');

    double price = 0.0;
    buffer >> price;
    buffer.ignore(1, ',');

    int quantity = 0;
    buffer >> quantity;

    // Check whether conversion succeeded. We'll assume a price or quantity 
    // of 0 is invalid:
    if (price == 0.0 || quantity = 0)
        is.setstate(std::ios::failbit);

    // Since we got valid data, put it into the destination:
    s.name = name;
    s.price = price;
    s.quantity = quantity;
    return is;
}

这让我们可以从输入流中读取一条记录知道转换是否成功。一旦我们有了读取一条记录的代码,剩下的就变得微不足道了——我们可以使用一对正确类型的 istream_iterator 来初始化一个数据向量:

// read the data in one big gulp (sorry, couldn't resist).
//
std::vector<soft_drink> drink_data((std::istream_iterator<soft_drink>(infile)), 
                                    std::istream_iterator<soft_drink>());
于 2012-04-22T23:36:37.887 回答
1

首先研究如何将一个项目与其他项目分开:

如何在 C++ 中拆分字符串?(通过空格)

之后,您将获得一个新字符串,其格式为:drinkName,drinkCost,drinkQuantity

如果您考虑一下,将项目的每个信息分开的是符号,(逗号),所以您需要查看这篇文章,因为它也显示了如何用逗号分割。

为了帮助存储此信息,您可以创建一个具有 3 个变量的新数据类型(类):

class Drink
{
public:
    std::string name;
    std::string value;     // or float
    std::string quantity;  // or int
};

最后,您可以对std::vector<Drink>里面的所有信息感到满意。

于 2012-04-22T22:32:23.867 回答