我正在尝试从名为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或标题)
答案 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();
}
让我知道是否有什么我可以清除的。