problème de flux de chaîne
-
21-12-2019 - |
Question
Problème:
J'ai un fichier texte contenant des lignes d'informations selon les besoins ci-dessous sous "fichier txt".J'essaie de cartographier les éléments afin de pouvoir terminer ma mission.En les cartographiant, j'utilise istringstream
.Mon problème vient de le faire fonctionner lorsqu'il y a plusieurs mots dans un élément que je souhaite enregistrer dans une seule chaîne.Par exemple, la "Compote de pommes non sucrée", je veux que ce soit une seule chaîne (item.setNewItem).Toute aide serait vraiment appréciée, et comme je suis un étudiant actuel, toute abrutissement pour mon bien serait vraiment appréciée.=)
fichier txt :
1 tasse de sucre | 1 tasse de compote de pommes non sucrées | calorie
Code:
void mapList(ifstream &foodReplace, map<string, Substitutions> &subs)
{
string line;
while (getline (foodReplace, line));
{
Substitutions item;
istringstream readLine(line);
readLine << item.setOldAmount
<< item.setOldMeasurement
<< item.setOldItem
<< item.setNewAmount
<< item.setNewMeasurement
<< item.setNewItem;
subs.insert(pair<string, Substitutions>(item.getOldItem, item));
}
}
La solution 2
je vraiment j'apprécie l'aide de tout le monde, cela m'a aidé à arriver là où j'en avais besoin même si je n'ai pas utilisé exactement le même code, vous trouverez ci-dessous la solution que j'ai choisie, encore une fois, merci à tous.=)
//function to populate map and update object info
void mapList(fstream &foodReplace, map<string, Substitutions> &subs)
{
string line;
while (getline (foodReplace, line)) //gets the line and saves it to line
{
Substitutions item;
istringstream readLine(line); //reads it into readLine
//declaring variables
double amount;
string unit;
string ingredient;
string benefit;
//gets old ingredient and saves in object
getIngredient(readLine, amount, unit, ingredient);
item.setOldAmount(amount);
item.setOldMeasurement(unit);
item.setOldItem(ingredient);
//gets new ingredient and saves to object
getIngredient(readLine, amount, unit, ingredient);
item.setNewAmount(amount);
item.setNewMeasurement(unit);
item.setNewItem(ingredient);
//reads in last piece and saves in object
readLine >> benefit;
item.setBenefit(benefit);
//inserts object into map
subs.insert(pair<string, Substitutions>(item.getOldItem(), item));
}
}
//function to extract amount-units-ingredient
void getIngredient(istringstream &stream, double &amount, string &unit, string &ingredient)
{
//resetting variables
amount = 0;
unit = "";
ingredient = "";
string temp;
//setting variables
stream >> amount;
stream >> unit;
stream >> temp;
//read until delimiter is hit
while (temp != "|")
{
ingredient += temp + " ";
stream >> temp;
}
//removes the space at the end of the ingredient
ingredient = ingredient.substr(0, ingredient.length() - 1);
}
Autres conseils
Vous pouvez simplement fournir un troisième paramètre à getline pour spécifier le délimiteur :
http://www.cplusplus.com/reference/string/string/getline/
Et puis vous pouvez lire les premier et deuxième champs vers « » et le troisième champ vers « | ».
L'appel serait le suivant :
void mapList(ifstream &foodReplace, map<string, Substitutions> &subs)
{
string line;
while (getline (foodReplace, line));
{
Substitutions item;
istringstream readLine(line);
getline(readLine, item.setOldAmount, ' '); //you may need to read this in to a temp string if setOldAmount is an int
getline(readLine, item.setOldMeasurement, ' ');
getline(readLine, item.setOldItem, '|');
getline(readLine, item.setNewAmount, ' '); //you may need to read this in to a temp string if setNewAmount is an int
getline(readLine, item.setNewMeasurement, ' ');
getline(readLine, item.setNewItem, '|');
subs.insert(pair<string, Substitutions>(item.getOldItem, item));
}
}