Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
504 views
in Technique[技术] by (71.8m points)

store elements of a string into different vectors/containers c++

Greetings all im pretty new to c++ but enjoying it alot (i come from doing c) this is a third program part of a system im building and im looking for example code to just help with a function so i have a small question, ive been going through alot of examples and cant find exactly what i want, this may be obvious but im just having a brain fart with it. I want to read a .txt file with a layout of: category, item, price, itemnumber

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

i then want to detect ',' and put the different elements into seperate vectors, ive tried a few things such as getline, ispunct (the full stops in price make this non viable) same with isspace, i did wonder about using an 'ignore' with these but think thats bad practise to list so much unless i can define i only want isspunt to check ','. feel free to modify my examples or provide your own.

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

This above is the class im using, ive attached the overloader with this.

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

this is only storing into 1 though, if any of my examples can be modified id be grateful.

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

this doesnt work either this was the ispunct thing i was sying about, i tried it as i wondered if somwhere in the while loops i could add lines to parse the different elements of the string into seperate vectors.

so to reiterate my question: I want to read the file line by line take each element from that line and store in a vector, layout is always the same in the .txt but the words are different sizes they are always seperated by a ',' though.

Thanks for any help you can provide.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

A simple way of doing this is probably using a std::stringstream in combination with getline like this:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...