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

时间:2019-12-04 10:26:24

标签: c++

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

ID,项目,颜色,大小,数量,价格

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或标题)

2 个答案:

答案 0 :(得分:1)

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

struct stock_item
{
    std::string id;
    std::string title;
    std::string colour;
    std::string size;
    int quantity;
    double cost;
};

一旦您能够从文件中的一行创建stock_item,就可以在任意位置/任意位置轻松存储和操作它:

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';
}

因此您需要解析该文件:

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;
}

然后,您需要定义以下stock_from_string函数:

auto stock_from_string(std::string const& line)
{
    stock_item result;
    // parse your line here
    return result;
}

瞧瞧!

答案 1 :(得分:1)

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

我不确定您的意思

  

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

但我将向您展示几种不同的方式。

字符串向量

由于看起来您拥有std::string的所有内容,因此可以继续进行操作,只需制作一个字符串向量即可。但是,您有许多不应该是字符串的数值。在以下各节中,我将提供一些策略来将这些值保持为数值。

但是,在这里,如果您希望每个条目在向量中都有其自己的元素,则代码将变为

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

    string id, title, color, size, quantity, cost;
    vector<string> all_data;  // Create vector

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

        // Add to vector
        all_data.push_back(title);
        all_data.push_back(color);
        all_data.push_back(size);
        all_data.push_back(quantity);
        all_data.push_back(cost);
    }

    infile.close();
}

请注意,我确实更改了一些原始代码。

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

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

    string id, title, color, size, quantity, cost;
    vector<string> all_data;  // Create vector

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

        // Make one big string
        string new_element = 
            title + ' ' + color + ' ' + ' ' + size + ' ' +
            quantity + ' ' + cost;

        // Add the new element to the vector
        all_data.push_back(new_element);  
    }

    infile.close();
}

结构向量

可能是前往此处保留原始数据类型的最佳方法。使用这种方法,可以将数据声明为结构,然后以这种方式提供所有内容。

struct Data
{
    int id;
    string title, color, size;
    unsigned quantity;
    double cost;
};

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

    string id, title, color, size, quantity, cost;
    vector<Data> all_data; // Create vector of Data

    //If file open is successful
    while (infile.peek() != EOF)
    {
        int      new_id;
        unsigned new_quantity;
        double   new_cost;

        getline(infile, id, ',');
        getline(infile, title, ',');
        getline(infile, color, ',');
        getline(infile, size, ',');
        getline(infile, quantity, ',');
        getline(infile, cost, '\n');

        // Convert some datatypes
        new_id = stoi(id);
        new_quantity = static_cast<unsigned>(stol(quantity));
        new_cost = stod(cost);

        // Add new element to vector
        all_data.emplace_back(Data{ new_id, title, color, size, new_quantity, new_cost });
    }

    infile.close();
}

让我知道是否有什么我可以清除的。

相关问题