だから私は標準入力からこのような入力を読み取ろうとしています(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
に読み込むことに関係していると思いますか?ここでどんな助けもいただければ幸いです。
あなたはほとんどそこにいます、エラーはおそらく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;
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 );
}
お役に立てれば。
cin >> name >> course >> grade;
理由は>>
とにかく空白になるまで読み込みます。
コードに_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();
}
}
}
_