I want to make a custom istream
manipulator that reads 2 characters from the input, then skips 2 characters from the input, and does that until it runs out of any input.
For example, if I have code like this:
std::string str;
std::cin >> skipchar >> str;
Where skipchar
is my manipulator, if the user enters 1122334455
, str
should contain 113355
.
This is what I've got so far, I don't know what I should put in the while loop condition to make this code work properly:
istream& skipchar(istream& stream)
{
char c;
while(1)
{
for (int i = 0; i < 2; ++i)
stream >> c;
for (int i = 0; i < 2; ++i)
stream.ignore(1, '\0');
}
return stream;
}
Any help would be appreciated.
That's a very nice question. I don't know if it's possible. But I implemented something different which gives you the same short syntax you wanted, by overloading the >> operator
with a new class called Skip2
. Here is the code (which I really enjoyed writing! :-) )
#include <iostream>
#include <string>
#include <istream>
#include <sstream>
using namespace std;
class Skip2 {
public:
string s;
};
istream &operator>>(istream &s, Skip2 &sk)
{
string str;
s >> str;
// build new string
ostringstream build;
int count = 0;
for (char ch : str) {
// a count "trick" to make skip every other 2 chars concise
if (count < 2) build << ch;
count = (count + 1) % 4;
}
// assign the built string to the var of the >> operator
sk.s = build.str();
// and of course, return this istream
return s;
}
int main()
{
istringstream s("1122334455");
Skip2 skip;
s >> skip;
cout << skip.s << endl;
return 0;
}