Getline lezen van cin in een stringstream (C++)

Dus ik probeer invoer op deze manier te lezen van de standaardinvoer (met behulp van cin):

Adam Engels 85
Charlie Math 76
Erica Geschiedenis 82
Richard Wetenschap 90

Mijn doel is om uiteindelijk elk gegevensstuk in zijn eigen cel op te slaan in een gegevensstructuur die ik heb gemaakt, dus eigenlijk wil ik de invoer ontleden, zodat elk stuk gegevens individueel is. Omdat elke rij invoer één voor één door de gebruiker wordt ingevoerd, krijg ik elke keer een hele rij invoer die ik moet ontleden. Momenteel probeer ik zoiets als dit:

stringstream ss;
getline(cin, ss);
string name;
string course;
string grade;
ss >> name >> course >> grade;

De fout die ik heb is dat XCode me vertelt dat er geen overeenkomende functieaanroep is naar getline, wat me in de war brengt. Ik heb de stringbibliotheek toegevoegd, dus ik vermoed dat de fout te maken heeft met het gebruik van getlineom van cinin te lezen in een stringstream? Alle hulp hier wordt op prijs gesteld.


Antwoord 1, autoriteit 100%

Je bent er bijna, de fout is hoogstwaarschijnlijk1veroorzaakt omdat je getlineprobeert aan te roepen met de tweede parameter stringstream, maak gewoon een kleine wijziging en sla de gegevens eerst op in de std::cinin een stringen gebruik deze vervolgens om een ​​stringstreamte initialiseren, van waaruit u kan de invoer extraheren:

// read input
string input;
getline(cin, input);
// initialize string stream
stringstream ss(input);
// extract input
string name;
string course;
string grade;
ss >> name >> course >> grade;

1. Ervan uitgaande dat je hebt opgenomen:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

Antwoord 2, autoriteit 61%

Je kunt std::getline()geen std::stringstream; alleen een std::string. Lees als een tekenreeks en gebruik vervolgens een tekenreeksstroom om deze te ontleden.

struct Student
{
  string   name;
  string   course;
  unsigned grade;
};
vector <Student> students;
string s;
while (getline( cin, s ))
{
  istringstream ss(s);
  Student student;
  if (ss >> student.name >> student.course >> student.grade)
    students.emplace_back( student );
}

Hopelijk helpt dit.


Antwoord 3, autoriteit 17%

Je kunt gewoon cin >> name >> course >> grade;omdat >>sowieso zal lezen tot witruimte.


Antwoord 4

Ofwel heb je geen using namespace stdin je code of je komt niet volledig in aanmerking voor aanroepen naar de API’s in de std naamruimte met een std::voorvoegsel, bijvoorbeeld std::getline(). De onderstaande oplossing parseert in plaats daarvan CSV om waarden met witruimte te tokeniseren. De logica voor stdin-extractie, het ontleden van de CSV en het converteren van cijfer van string naar int zijn allemaal gescheiden. Het gebruik van regex_token_iterator is waarschijnlijk het meest gecompliceerde deel, maar het gebruikt voor het grootste deel vrij eenvoudige regex.

// foo.txt:
// Adam,English,85
// Charlie,Math,76
// Erica,History,82
// Richard,Science,90
// John,Foo Science,89
// after compiling to a.exe, run with:
// $ ./a.exe < foo.txt 
// output
// name: Adam, course: English, grade: 85
// name: Charlie, course: Math, grade: 76
// name: Erica, course: History, grade: 82
// name: Richard, course: Science, grade: 90
// name: John, course: Foo Science, grade: 89
#include <iostream>
#include <sstream>
#include <regex>
#include <vector>
using namespace std;
typedef unsigned int uint;
uint stoui(const string &v) {
   uint i;
   stringstream ss;
   ss << v;
   ss >> i;
   return i;
}
string strip(const string &s) {
   regex strip_pat("^\\s*(.*?)\\s*$");
   return regex_replace(s, strip_pat, "$1");
}
vector<string> parse_csv(string &line) {
   vector<string> values;
   regex csv_pat(",");
   regex_token_iterator<string::iterator> end;
   regex_token_iterator<string::iterator> itr(
      line.begin(), line.end(), csv_pat, -1);
   while (itr != end)
      values.push_back(strip(*itr++));
   return values;
}
struct Student {
   string name;
   string course;
   uint grade;
   Student(vector<string> &data) : 
      name(data[0]), course(data[1]), grade(stoui(data[2])) {}
   void dump_info() {
      cout << "name: " << name << 
      ", course: " << course << 
      ", grade: " << grade << endl;
   }
};
int main() {
   string line;
   while (getline(cin, line)) {
      if (!line.empty()) {
         auto csv = parse_csv(line);
         Student s(csv);
         s.dump_info();
      }
   }
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4 + ten =

Other episodes