这是我需要阅读的文件。
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 ++,请帮助我。
这是我需要阅读的文件。
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 ++,请帮助我。
我建议将这三个变量捆绑到一个数据类型中。让我们称之为“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/
在某些(但绝对不是全部)方面,我的建议与@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>());
首先研究如何将一个项目与其他项目分开:
如何在 C++ 中拆分字符串?(通过空格)
之后,您将获得一个新字符串,其格式为:drinkName,drinkCost,drinkQuantity
如果您考虑一下,将项目的每个信息分开的是符号,
(逗号),所以您需要查看这篇文章,因为它也显示了如何用逗号分割。
为了帮助存储此信息,您可以创建一个具有 3 个变量的新数据类型(类):
class Drink
{
public:
std::string name;
std::string value; // or float
std::string quantity; // or int
};
最后,您可以对std::vector<Drink>
里面的所有信息感到满意。