将字符串的元素存储到不同的向量/容器c ++中

时间:2015-04-07 17:22:34

标签: c++ string file vector

问候所有我对c ++很新,但很享受它(我来自做c)这是系统构建的第三个程序部分,我正在寻找示例代码来帮助一个函数所以我有一个小问题,我已经经历了很多例子,无法找到我想要的东西,这可能是显而易见的,但我只是脑筋屁。 我想阅读一个.txt文件,其布局为: 类别,项目,价格,项目编号

main,steak bernaise,15,101
pudding,banoffee,3.99,102
starter,prawn cocktail,2.89,103
drink,gin & tonic,3.50,104

然后我想检测','并将不同的元素放入单独的向量中,香港专业教育学院尝试过一些东西,比如getline,ispunct(价格的全部停止让这个不可行)与isspace相同,我确实对使用感到疑惑一个'忽略'与这些,但认为这是不好的做法列出这么多,除非我可以定义我只想要isspunt检查','。随时修改我的示例或提供自己的示例。

class Food {
private:
string category;
string item;
string price;
string itemnum;
public:
string tostring();
Food(string cat, string it, string pr, string itno)
    : category(cat), item(it), price(pr), itemnum(itno) {  }

void display(ostream& output) const{
    output << category << " " << item << " " << price << " " << itemnum << endl;
}
};

ostream& operator<<(ostream& output, Food const& f){
f.display(output);
return output;
}

以上是我正在使用的类,我已经附上了这个overloader。

void filein::intake() {
string tempnum;
ifstream fin("bill.txt");
if(fin) {
    while(!fin.eof()) {
        string itemnum;
        string category;
        string item;
        string price;
        getline(fin, category, ',');
        getline(fin, item, ',');
        getline(fin, price, ',');
        getline(fin, itemnum);
        _items.push_back(Food(category, item, price, itemnum));
            }
    }
    for (size_t i = 0; i < _items.size(); ++i){
        cout << _items[i];
    }
}

这只是存储到1中,如果我的任何一个例子都可以修改,那么感激不尽。

vector<string> split(const string& s)
{
vector<string> _totals;
vector<string> _items;
typedef string::size_type string_size;
string_size i = 0;

    // invariant: we have processed characters [original value of i, i) 
    while (i != s.size()) {
    // ignore leading blanks
    // invariant: characters in range [original i, current i) are all spaces
    while (i != s.size() && ispunct(s[i]))
     ++i;

    // find end of next word
     string_size j = i;
     // invariant: none of the characters in range [original j, current j)is a space
    while (j != s.size() && !ispunct(s[j]))
     j++;

     // if we found some nonpunctuation characters 
     if (i != j) {
     _totals.push_back(s.substr(i, j - i));


     i = j;
  }
 }
return _totals;
}

这不起作用,这是我正在考虑的ispunct事情,我尝试它,因为我想知道在while循环中是否somwhere我可以添加行来解析字符串的不同元素到单独的向量。

所以重申一下我的问题:我想逐行读取文件从该行中取出每个元素并存储在向量中,.txt中的布局总是相同但是单词大小不同它们总是被分隔a','虽然。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

执行此操作的一种简单方法可能是将std::stringstreamgetline结合使用,如下所示:

std::string str;
while (std::getline(fin, str)) // fin is the input stream
{
    std::istringstream iss(str);
    std::string token;
    while (std::getline(iss, token, ',')) // get the token as a std::string
    {
         // process it here, can use `stoi` to convert to int
    }
}

答案 1 :(得分:0)

这是另一种方法 - 这个函数split()将逗号分隔的字符串拆分为字符串向量。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

vector<string> split(const string& s)
{
    vector<string> v;
    size_t current = 0;
    while (current != string::npos) {
        auto next = s.find_first_of(',', current);
        if (next == string::npos) {
            v.push_back(s.substr(current));
            current = string::npos;
        }
        else {
            v.push_back(s.substr(current, next - current));
            current = next + 1;
        }
    }
    return v;
}

// test the function
int main()
{
    ifstream infile("bill.txt");
    while(!infile.eof()) {
        string s;
        getline(infile, s);
        auto words = split(s);
        if (words.size() == 4) {
            cout << words[0] << "|" << words[1] << "|" << words[2]<< "|" << words[3] << endl;
        }
    }

   return 0;
}