fork download
  1. #include <iostream>
  2. #include <sstream>
  3. #include <string>
  4.  
  5. struct Text : std::string { using std::string::string; };
  6.  
  7. std::istream& operator>>(std::istream& is, Text& t)
  8. {
  9. if (is.flags() & is.skipws) is >> std::skipws;
  10. for (char c: t)
  11. {
  12. if (is.peek() != c)
  13. {
  14. is.setstate(std::ios::failbit);
  15. break;
  16. }
  17. is.get();
  18. }
  19. return is;
  20. }
  21.  
  22. struct Until_Delim {
  23. Until_Delim(std::string& s, std::string delim) : s_(s), delim_(delim) { }
  24. std::string& s_;
  25. std::string delim_;
  26. };
  27.  
  28. std::istream& operator>>(std::istream& is, const Until_Delim& ud)
  29. {
  30. std::istream::sentry sentry(is);
  31. size_t in_delim = 0;
  32. for (char c = is.get(); is; c = is.get())
  33. {
  34. if (c == ud.delim_[in_delim])
  35. {
  36. if (++in_delim == ud.delim_.size())
  37. break;
  38. continue;
  39. }
  40. else if (in_delim) // was part-way into delimiter match...
  41. {
  42. ud.s_.append(ud.delim_, 0, in_delim);
  43. in_delim = 0;
  44. }
  45. ud.s_ += c;
  46. }
  47. // may need to trim trailing whitespace...
  48. if (is.flags() & std::ios_base::skipws)
  49. while (!ud.s_.empty() && std::isspace(ud.s_.back()))
  50. ud.s_.pop_back();
  51. return is;
  52. }
  53.  
  54. int main()
  55. {
  56. Text t{"ignore"};
  57. std::istringstream iss("ignore3.14ignore Some ignorable Text ignore 2.718");
  58.  
  59. double pi, e;
  60. std::string a_string;
  61. if (iss >> t >> pi >> t >> Until_Delim(a_string, "ignore") >> e)
  62. std::cout << "pi " << pi << ", a_string '" << a_string << "', e " << e << '\n';
  63. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
pi 3.14, a_string 'Some ignorable Text', e 2.718