重複の可能性:
C ++で文字列を分割する方法は?
C++分割文字列
以下に示すように、C++でファイルから行を分割するにはどうすればよいですか?
次の形式のゲーム出力の結果を保存したいと思います。
CFC 1 - 0 RES
私には4つの変数があります:
string team1;
string team2;
int goalst1;
int goalst2;
対応する各部分が上記の4つの変数に含まれるように、文字列を分割するにはどうすればよいですか?
重複の可能性:
C ++で文字列を分割する方法は?
C++分割文字列
以下に示すように、C++でファイルから行を分割するにはどうすればよいですか?
次の形式のゲーム出力の結果を保存したいと思います。
CFC 1 - 0 RES
私には4つの変数があります:
string team1;
string team2;
int goalst1;
int goalst2;
対応する各部分が上記の4つの変数に含まれるように、文字列を分割するにはどうすればよいですか?
string team1;
string team2;
int goalst1;
int goalst2;
string dash;
std::cin >> team1 >> goalst1 >> dash >> goalst2 >> team2;
あなたはこれを必要とするようなことをすることができます#include <sstream>
:
char trash;
std::stringstream mystream(myInputString);
mystream >> team1 >> goalst1 >> trash>> goalst2 >> team2;
また
char trash;
std::stringstream mystream;
mystream << myInputString;
mystream >> team1 >> goalst1 >> trash>> goalst2 >> team2;
編集:これはより高度ですが、ちょっときちんとしています。これをヘッダーに貼り付けます。
#include <iostream>
#include <string>
#include <array>
#include <cstring>
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e(&sliteral)[N]) {
std::array<e, N-1> buffer; //get buffer
in >> buffer[0]; //skips whitespace
if (N>2)
in.read(&buffer[1], N-2); //read the rest
if (strncmp(&buffer[0], sliteral, N-1)) //if it failed
in.setstate(in.rdstate() | std::ios::badbit); //set the state
return in;
}
template<class e, class t>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, const e& cliteral) {
e buffer; //get buffer
in >> buffer; //read data
if (buffer != cliteral) //if it failed
in.setstate(in.rdstate() | std::ios::badbit); //set the state
return in;
}
template<class e, class t, int N>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, e(&carray)[N]) {
return std::operator>>(in, carray);
}
template<class e, class t, class a>
std::basic_istream<e,t>& operator>>(std::basic_istream<e,t>& in, a& obj) {
return in >> obj; //read data
}
これにより、ストリームで文字列リテラルを実行できます。
std::stringstream mystream(myInputString);
mystream >> team1 >> goalst1 >> '-' >> goalst2 >> team2;
また
std::stringstream mystream;
mystream << myInputString;
mystream >> team1 >> goalst1 >> '-' >> goalst2 >> team2;
私がそれを正しく理解すれば、uはおそらくファイルから読み取ろうとしています。次にifstreamを使用すると、cinなどの標準入力から読み取るのと同じようにファイルから読み取ることができます。
すなわち
ifstream myfile("filename");
cin演算子の代わりにmyfileを使用すると、完了です。
私boost::split
はその種の仕事が好きです:
#include <string>
#include <vector>
#include <boost/algorithm/string/split.hpp>
struct Result {
std::string team1;
std::string team2;
unsigned goals1;
unsigned goals2;
};
Result split(std::string const& s) {
std::vector<std::string> splitted;
boost::split(s, splitted, boost::token_compress_on);
if (splitted.at(2) != "-") {
throw runtime_error("The string format does not match");
}
Result r;
r.team1 = splitted.at(0);
r.team2 = splitted.at(4);
r.goals1 = stoi(splitted.at(1));
r.goals2 = stoi(splitted.at(3));
return r;
}