#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
using std::cin;
using std::cout;
using std::endl;
void parse_as_char(std::istream& is)
{
char c1 = '#', c2 = '#', c3 = '#';
is.clear();
is >> c1;
cout << "(1) c1='" << c1 << "', is.good()=" << is.good() << ", is.eof()=" << is.eof() << ", is.fail()=" << is.fail() << endl;
is >> c2;
cout << "(2) c2='" << c2 << "', is.good()=" << is.good() << ", is.eof()=" << is.eof() << ", is.fail()=" << is.fail() << endl;
is >> c3;
cout << "(3) c3='" << c3 << "', is.good()=" << is.good() << ", is.eof()=" << is.eof() << ", is.fail()=" << is.fail() << endl;
}
void parse_as_str(std::istream& is)
{
std::string s1 = "#", s2 = "#", s3 = "#";
is.clear();
is >> s1;
cout << "(1) s1=\"" << s1 << "\", is.good()=" << is.good() << ", is.eof()=" << is.eof() << ", is.fail()=" << is.fail() << endl;
is >> s2;
cout << "(2) s2=\"" << s2 << "\", is.good()=" << is.good() << ", is.eof()=" << is.eof() << ", is.fail()=" << is.fail() << endl;
is >> s3;
cout << "(3) s3=\"" << s3 << "\", is.good()=" << is.good() << ", is.eof()=" << is.eof() << ", is.fail()=" << is.fail() << endl;
}
void test_parse_as_str(const char* szInput)
{
std::istringstream ist;
cout << __FUNCTION__ << ": Input=\"" << szInput << "\"" << endl;
ist.str(szInput);
parse_as_str(ist);
cout << endl;
}
void test_parse_as_char(const char* szInput)
{
std::istringstream ist;
cout << __FUNCTION__ << ": Input=\"" << szInput << "\"" << endl;
ist.str(szInput);
parse_as_char(ist);
cout << endl;
}
bool parse_as_string_with_common_logic(std::istream& is, std::string& s, bool& bErr)
{
s.clear();
is >> s;
if (!is) {
if (is.eof()) {
/*pass*/
}
else {
bErr = true;
}
return false;
}
return true;
}
void test_parse_as_string_with_common_logic(const char* szInput, bool& bErr)
{
std::string str;
cout << __FUNCTION__ << ": Input=\"" << szInput << "\"" << endl;
std::istringstream ist;
ist.str(szInput);
size_t i = (size_t)0;
while (parse_as_string_with_common_logic(ist, str, bErr)) {
i++;
cout << "(" << i << ") str=\"" << str << "\", bErr=" << bErr << endl;
}
cout << "(" << "F" << ") str=\"" << str << "\", bErr=" << bErr << endl;
cout << endl;
}
int main()
{
bool bErr = false;
// ケースA)
cout << "Case A)" << endl;
test_parse_as_char("A B"); // Bの後ろに空白無し --> 'B' を読んだ後の is >> c3 で初めて!is.good()かつis.eof()成立(getc()と同じ挙動)
// ケースA')
cout << "Case A')" << endl;
test_parse_as_char("A B "); // Bの後ろに空白有り --> (同上)
// ケースB)
cout << "Case B)" << endl;
test_parse_as_str("A B"); // Bの後ろに空白無し --> "B" を読んだ時点で!is.good()かつis.eof()成立
// ケースC)
cout << "Case C)" << endl;
test_parse_as_str("A B "); // Bの後ろに空白有り --> "B" を読んだ後の is >> s3 で初めて!is.good()かつis.eof()成立(getc()と同じ挙動)
// 共通判定ロジックによるCase Bの読み取り
cout << "Case B with common logic:" << endl;
test_parse_as_string_with_common_logic("A B", bErr);
// 共通判定ロジックによるCase Cの読み取り
cout << "Case C with common logic:" << endl;
test_parse_as_string_with_common_logic("A B ", bErr);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvbWFuaXA+Cgp1c2luZyBzdGQ6OmNpbjsKdXNpbmcgc3RkOjpjb3V0Owp1c2luZyBzdGQ6OmVuZGw7Cgp2b2lkIHBhcnNlX2FzX2NoYXIoc3RkOjppc3RyZWFtJiBpcykKewoJY2hhciBjMSA9ICcjJywgYzIgPSAnIycsIGMzID0gJyMnOwoKCWlzLmNsZWFyKCk7CglpcyA+PiBjMTsKCWNvdXQgPDwgIigxKSBjMT0nIiA8PCBjMSA8PCAiJywgaXMuZ29vZCgpPSIgPDwgaXMuZ29vZCgpIDw8ICIsIGlzLmVvZigpPSIgPDwgaXMuZW9mKCkgPDwgIiwgaXMuZmFpbCgpPSIgPDwgaXMuZmFpbCgpIDw8IGVuZGw7CglpcyA+PiBjMjsKCWNvdXQgPDwgIigyKSBjMj0nIiA8PCBjMiA8PCAiJywgaXMuZ29vZCgpPSIgPDwgaXMuZ29vZCgpIDw8ICIsIGlzLmVvZigpPSIgPDwgaXMuZW9mKCkgPDwgIiwgaXMuZmFpbCgpPSIgPDwgaXMuZmFpbCgpIDw8IGVuZGw7CglpcyA+PiBjMzsKCWNvdXQgPDwgIigzKSBjMz0nIiA8PCBjMyA8PCAiJywgaXMuZ29vZCgpPSIgPDwgaXMuZ29vZCgpIDw8ICIsIGlzLmVvZigpPSIgPDwgaXMuZW9mKCkgPDwgIiwgaXMuZmFpbCgpPSIgPDwgaXMuZmFpbCgpIDw8IGVuZGw7Cn0KCnZvaWQgcGFyc2VfYXNfc3RyKHN0ZDo6aXN0cmVhbSYgaXMpCnsKCXN0ZDo6c3RyaW5nIHMxID0gIiMiLCBzMiA9ICIjIiwgczMgPSAiIyI7CgoJaXMuY2xlYXIoKTsKCWlzID4+IHMxOwoJY291dCA8PCAiKDEpIHMxPVwiIiA8PCBzMSA8PCAiXCIsIGlzLmdvb2QoKT0iIDw8IGlzLmdvb2QoKSA8PCAiLCBpcy5lb2YoKT0iIDw8IGlzLmVvZigpIDw8ICIsIGlzLmZhaWwoKT0iIDw8IGlzLmZhaWwoKSA8PCBlbmRsOwoJaXMgPj4gczI7Cgljb3V0IDw8ICIoMikgczI9XCIiIDw8IHMyIDw8ICJcIiwgaXMuZ29vZCgpPSIgPDwgaXMuZ29vZCgpIDw8ICIsIGlzLmVvZigpPSIgPDwgaXMuZW9mKCkgPDwgIiwgaXMuZmFpbCgpPSIgPDwgaXMuZmFpbCgpIDw8IGVuZGw7CglpcyA+PiBzMzsKCWNvdXQgPDwgIigzKSBzMz1cIiIgPDwgczMgPDwgIlwiLCBpcy5nb29kKCk9IiA8PCBpcy5nb29kKCkgPDwgIiwgaXMuZW9mKCk9IiA8PCBpcy5lb2YoKSA8PCAiLCBpcy5mYWlsKCk9IiA8PCBpcy5mYWlsKCkgPDwgZW5kbDsKfQoKdm9pZCB0ZXN0X3BhcnNlX2FzX3N0cihjb25zdCBjaGFyKiBzeklucHV0KQp7CglzdGQ6OmlzdHJpbmdzdHJlYW0gaXN0OwoKCWNvdXQgPDwgX19GVU5DVElPTl9fIDw8ICI6IElucHV0PVwiIiA8PCBzeklucHV0IDw8ICJcIiIgPDwgZW5kbDsKCWlzdC5zdHIoc3pJbnB1dCk7CglwYXJzZV9hc19zdHIoaXN0KTsKCWNvdXQgPDwgZW5kbDsKfQoKdm9pZCB0ZXN0X3BhcnNlX2FzX2NoYXIoY29uc3QgY2hhciogc3pJbnB1dCkKewoJc3RkOjppc3RyaW5nc3RyZWFtIGlzdDsKCgljb3V0IDw8IF9fRlVOQ1RJT05fXyA8PCAiOiBJbnB1dD1cIiIgPDwgc3pJbnB1dCA8PCAiXCIiIDw8IGVuZGw7Cglpc3Quc3RyKHN6SW5wdXQpOwoJcGFyc2VfYXNfY2hhcihpc3QpOwoJY291dCA8PCBlbmRsOwp9Cgpib29sIHBhcnNlX2FzX3N0cmluZ193aXRoX2NvbW1vbl9sb2dpYyhzdGQ6OmlzdHJlYW0mIGlzLCBzdGQ6OnN0cmluZyYgcywgYm9vbCYgYkVycikKewoJcy5jbGVhcigpOwoJaXMgPj4gczsKCWlmICghaXMpIHsKCQlpZiAoaXMuZW9mKCkpIHsKCQkJLypwYXNzKi8KCQl9CgkJZWxzZSB7CgkJCWJFcnIgPSB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CglyZXR1cm4gdHJ1ZTsKfQoKdm9pZCB0ZXN0X3BhcnNlX2FzX3N0cmluZ193aXRoX2NvbW1vbl9sb2dpYyhjb25zdCBjaGFyKiBzeklucHV0LCBib29sJiBiRXJyKQp7CglzdGQ6OnN0cmluZyBzdHI7CgoJY291dCA8PCBfX0ZVTkNUSU9OX18gPDwgIjogSW5wdXQ9XCIiIDw8IHN6SW5wdXQgPDwgIlwiIiA8PCBlbmRsOwoJc3RkOjppc3RyaW5nc3RyZWFtIGlzdDsKCWlzdC5zdHIoc3pJbnB1dCk7CgoJc2l6ZV90IGkgPSAoc2l6ZV90KTA7Cgl3aGlsZSAocGFyc2VfYXNfc3RyaW5nX3dpdGhfY29tbW9uX2xvZ2ljKGlzdCwgc3RyLCBiRXJyKSkgewoJCWkrKzsKCQljb3V0IDw8ICIoIiA8PCBpIDw8ICIpIHN0cj1cIiIgPDwgc3RyIDw8ICJcIiwgYkVycj0iIDw8IGJFcnIgPDwgZW5kbDsKCX0KCWNvdXQgPDwgIigiIDw8ICJGIiA8PCAiKSBzdHI9XCIiIDw8IHN0ciA8PCAiXCIsIGJFcnI9IiA8PCBiRXJyIDw8IGVuZGw7CgoJY291dCA8PCBlbmRsOwp9CgppbnQgbWFpbigpCnsKCWJvb2wgYkVyciA9IGZhbHNlOwoKCS8vIOOCseODvOOCuUEpCgljb3V0IDw8ICJDYXNlIEEpIiA8PCBlbmRsOwoJdGVzdF9wYXJzZV9hc19jaGFyKCJBIEIiKTsJCS8vIELjga7lvozjgo3jgavnqbrnmb3nhKHjgZcgLS0+ICdCJyDjgpLoqq3jgpPjgaDlvozjga4gaXMgPj4gYzMg44Gn5Yid44KB44GmIWlzLmdvb2QoKeOBi+OBpGlzLmVvZigp5oiQ56uLKGdldGMoKeOBqOWQjOOBmOaMmeWLlSkKCgkvLyDjgrHjg7zjgrlBJykKCWNvdXQgPDwgIkNhc2UgQScpIiA8PCBlbmRsOwoJdGVzdF9wYXJzZV9hc19jaGFyKCJBIEIgIik7CQkvLyBC44Gu5b6M44KN44Gr56m655m95pyJ44KKIC0tPiAo5ZCM5LiKKQoKCS8vIOOCseODvOOCuUIpCgljb3V0IDw8ICJDYXNlIEIpIiA8PCBlbmRsOwoJdGVzdF9wYXJzZV9hc19zdHIoIkEgQiIpOwkJLy8gQuOBruW+jOOCjeOBq+epuueZveeEoeOBlyAtLT4gIkIiIOOCkuiqreOCk+OBoOaZgueCueOBpyFpcy5nb29kKCnjgYvjgaRpcy5lb2YoKeaIkOeriwoKCS8vIOOCseODvOOCuUMpCgljb3V0IDw8ICJDYXNlIEMpIiA8PCBlbmRsOwoJdGVzdF9wYXJzZV9hc19zdHIoIkEgQiAiKTsJCS8vIELjga7lvozjgo3jgavnqbrnmb3mnInjgoogLS0+ICJCIiDjgpLoqq3jgpPjgaDlvozjga4gaXMgPj4gczMg44Gn5Yid44KB44GmIWlzLmdvb2QoKeOBi+OBpGlzLmVvZigp5oiQ56uLKGdldGMoKeOBqOWQjOOBmOaMmeWLlSkKCgkvLyDlhbHpgJrliKTlrprjg63jgrjjg4Pjgq/jgavjgojjgotDYXNlIELjga7oqq3jgb/lj5bjgooKCWNvdXQgPDwgIkNhc2UgQiB3aXRoIGNvbW1vbiBsb2dpYzoiIDw8IGVuZGw7Cgl0ZXN0X3BhcnNlX2FzX3N0cmluZ193aXRoX2NvbW1vbl9sb2dpYygiQSBCIiwgYkVycik7CgoJLy8g5YWx6YCa5Yik5a6a44Ot44K444OD44Kv44Gr44KI44KLQ2FzZSBD44Gu6Kqt44G/5Y+W44KKCgljb3V0IDw8ICJDYXNlIEMgd2l0aCBjb21tb24gbG9naWM6IiA8PCBlbmRsOwoJdGVzdF9wYXJzZV9hc19zdHJpbmdfd2l0aF9jb21tb25fbG9naWMoIkEgQiAiLCBiRXJyKTsKfQo=
Case A)
test_parse_as_char: Input="A B"
(1) c1='A', is.good()=1, is.eof()=0, is.fail()=0
(2) c2='B', is.good()=1, is.eof()=0, is.fail()=0
(3) c3='#', is.good()=0, is.eof()=1, is.fail()=1
Case A')
test_parse_as_char: Input="A B "
(1) c1='A', is.good()=1, is.eof()=0, is.fail()=0
(2) c2='B', is.good()=1, is.eof()=0, is.fail()=0
(3) c3='#', is.good()=0, is.eof()=1, is.fail()=1
Case B)
test_parse_as_str: Input="A B"
(1) s1="A", is.good()=1, is.eof()=0, is.fail()=0
(2) s2="B", is.good()=0, is.eof()=1, is.fail()=0
(3) s3="#", is.good()=0, is.eof()=1, is.fail()=1
Case C)
test_parse_as_str: Input="A B "
(1) s1="A", is.good()=1, is.eof()=0, is.fail()=0
(2) s2="B", is.good()=1, is.eof()=0, is.fail()=0
(3) s3="#", is.good()=0, is.eof()=1, is.fail()=1
Case B with common logic:
test_parse_as_string_with_common_logic: Input="A B"
(1) str="A", bErr=0
(2) str="B", bErr=0
(F) str="", bErr=0
Case C with common logic:
test_parse_as_string_with_common_logic: Input="A B "
(1) str="A", bErr=0
(2) str="B", bErr=0
(F) str="", bErr=0