C++ 从文本文件读取并保存到列表

C++ 从文本文件读取并保存到列表,c++,C++,我试图从名为stock.txt的文件中读取,该文件包含以下值: 标识、项目、颜色、尺寸、数量、价格 11,T-shirt,blue,XL,2,10.500000 12,Supreme,red,M,10,20.500000 13,BANG,red,M,10,20.500000 我想把每一项都存储在一个向量列表中,我该怎么做呢 int main() { ifstream infile; infile.open("Stock.txt"); strin

我试图从名为
stock.txt
的文件中读取,该文件包含以下值:

标识、项目、颜色、尺寸、数量、价格

11,T-shirt,blue,XL,2,10.500000
12,Supreme,red,M,10,20.500000
13,BANG,red,M,10,20.500000
我想把每一项都存储在一个向量列表中,我该怎么做呢

int main() {
        ifstream infile;
        infile.open("Stock.txt");

        string id; string title; string colour; string size; string quantity; string cost;

        //If file open is successful
        while(infile.good()){
            getline(infile,id,',');
            getline(infile,title,',');
            getline(infile,colour,',');
            getline(infile,size,',');
            getline(infile,quantity,',');
            getline(infile,cost,'\n');        
        }

        infile.close();
}

然后,目标是实现一个搜索功能,在该功能中,我可以从该列表中搜索特定项目(例如,通过使用ID或标题)

在数据结构和代码之间创建一些协同作用:

struct stock_item
{
    std::string id;
    std::string title;
    std::string colour;
    std::string size;
    int quantity;
    double cost;
};
一旦您能够从文件中的一行创建一个
库存项目
,您就可以轻松地在任何地方/以任何方式存储和操作它:

std::vector<stock_item> some_vector;
stock_item some_stock_item;
// ...
some_vector.push_back(some_stock_item);
// ...
for (auto const& item : some_vector) {
    std::cout << "Item #" << item.id << '\n';
}

std::vector
添加元素有两种常用方法。一个是
.push_back()
,另一个是
.emplace_back()
push_back()
将构造对象,然后将其复制到向量中
emplace_back()
将直接在容器中构造对象

我不完全明白你说的是什么意思

我想将每个项目存储在一个向量列表中

但我会告诉你一些不同的方法

字符串向量 因为它看起来像是一个
std::string
,所以您可以继续创建一个字符串向量。但是,有许多数值实际上不应该是字符串。在接下来的几节中,我将给出一些策略,以便能够将这些值保持为数字

然而,在这里,如果您希望每个条目在向量中都有自己的元素,那么您的代码将成为

intmain()
{
河流充填;
infle.open(“Stock.txt”);
字符串id、标题、颜色、大小、数量、成本;
向量所有_数据;//创建向量
//如果文件打开成功
while(getline(infle,id,,'))
{
getline(填充,标题“,”);
getline(填充,颜色,',');
getline(填充,大小“,”);
getline(填充,数量,,);
getline(填充,成本,'\n');
//添加到向量
所有数据。向后推(标题);
所有_数据。向后推_(颜色);
所有_数据。向后推_(大小);
所有数据。推回(数量);
所有_数据。向后推_(成本);
}
infle.close();
}
请注意,我确实更改了一些原始代码

如果要将一个大字符串作为元素,也可以这样做:

intmain()
{
河流充填;
infle.open(“Stock.txt”);
字符串id、标题、颜色、大小、数量、成本;
向量所有_数据;//创建向量
//如果文件打开成功
while(getline(infle,id,,'))
{
getline(填充,标题“,”);
getline(填充,颜色,',');
getline(填充,大小“,”);
getline(填充,数量,,);
getline(填充,成本,'\n');
//做一根大绳子
字符串新元素=
标题+颜色+大小+
数量+“”+成本;
//将新元素添加到向量
所有_数据。向后推_(新_元素);
}
infle.close();
}
结构向量 在这里保存原始数据类型可能是最好的方法。使用这种方法,将数据声明为结构,然后以这种方式提供所有内容

struct数据
{
int-id;
字符串标题、颜色、大小;
无符号量;
双重成本;
};
int main()
{
河流充填;
infle.open(“Stock.txt”);
字符串id、标题、颜色、大小、数量、成本;
矢量所有_数据;//创建数据矢量
//如果文件打开成功
while(infle.peek()!=EOF)
{
int new_id;
未签名的新数量;
双倍的新成本;
getline(infle,id,,);
getline(填充,标题“,”);
getline(填充,颜色,',');
getline(填充,大小“,”);
getline(填充,数量,,);
getline(填充,成本,'\n');
//转换某些数据类型
新id=stoi(id);
新数量=静态铸造(stol(数量));
新成本=stod(成本);
//向向量添加新元素
所有数据。重新放置(数据{新id、标题、颜色、大小、新数量、新成本});
}
infle.close();
}

如果有什么需要我澄清的,请告诉我。

嗨,谢谢你的帮助。我有一个关于变量类型的问题,所以在我的例子中,我有ID(int)、quantiy(int)和cost(float),我不能用
getline
it来实现这一点seems@user11453590因此,理解第二个示例(您将要看到的示例)中发生的事情非常重要。所有内容都作为字符串读入,然后其中一些字符串被转换为数字类型(其中显示“
convert some datatypes
”)。循环内的
new_id
(等)变量用于保存数值,而循环外的变量仍然是所有字符串。那有帮助吗?是的,我现在有了。非常感谢!
auto stocks_from_stream(std::istream& in)
{
    std::vector<stock_item> result;
    std::string stock_line;
    while(std::getline(in, stock_line)) {
        auto item = stock_from_string(stock_line);
        result.push_back(item);
    }
    return result;
}
auto stock_from_string(std::string const& line)
{
    stock_item result;
    // parse your line here
    return result;
}