web-dev-qa-db-ja.com

getlineをcinから文字列ストリームに読み込む(C ++)

だから私は標準入力からこのような入力を読み取ろうとしています(cinを使用):

アダム英語85
チャーリー数学76
エリカの歴史82
リチャードサイエンス90

私の目標は、作成したデータ構造の各セルに最終的に各データを格納することです。したがって、基本的には、各データが個別になるように入力を解析します。入力の各行は一度に1つずつユーザーによって入力されるため、毎回、解析する必要のある入力の行全体を取得します。現在、私はこのようなものを試しています:

stringstream ss;
getline(cin, ss);

string name;
string course;
string grade;
ss >> name >> course >> grade;

私が持っているエラーは、XCodeがgetlineへの一致する関数呼び出しがないことを私に言っているということです、それは私を混乱させています。私はstringライブラリを含めたので、エラーはgetlineを使用してcinからstringstreamに読み込むことに関係していると思いますか?ここでどんな助けもいただければ幸いです。

8
user5482356

あなたはほとんどそこにいます、エラーはおそらく1 2番目のパラメータgetlineを使用してstringstreamを呼び出そうとしているために発生します。わずかな変更を加えて、データをstd::cinを最初にstringに入れ、次にそれを使用してstringstreamを初期化します。これから入力を抽出できます。

// 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.あなたが含まれていると仮定します:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;
10
Ziezi

std::getline() a std::stringstream; std::string。文字列として読み取り、文字列ストリームを使用して解析します。

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

お役に立てれば。

7
Dúthomhas

cin >> name >> course >> grade;理由は>>とにかく空白になるまで読み込みます。

2

コードに_using namespace std_が含まれていないか、_std::_接頭辞が付いたstd名前空間のAPIへの呼び出しを完全に修飾していない、たとえばstd::getline() 。以下のソリューションでは、代わりにCSVを解析して、空白を含む値をトークン化します。 stdin抽出、CSVの解析、およびグレードを文字列からintに変換するロジックはすべて分離されています。 regex_token_iteratorの使用法はおそらく最も複雑な部分ですが、ほとんどの部分でかなり単純な正規表現を使用しています。

_// 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();
      }
   }
}
_
0
solstice333