问候所有我对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','虽然。
感谢您提供的任何帮助。
答案 0 :(得分:1)
执行此操作的一种简单方法可能是将std::stringstream
与getline
结合使用,如下所示:
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;
}