Тааак, задам экстремальный вопрос:
В общем была себе перегрузка оператора ввода в одном примере, рассчитана на ввод 14 символов и их сохранение в разных переменных, а теперь вот захотелось мне добавить изначально проверку содержимого, но хитро - так чтобы предыдущий написанный код не редактировать. Так вот проверку входящего потока я пририсовал, а вот теперь хочу чтобы если всё хорошо с потоком то из моего символьного массива всё запихивалось в поток на ввод, те: создать для программы впечатление что во входящем потоке уже есть 14 символов из моего массива и теперь при следующем cin>> оно сначала сжевало мои запихнутые 14 символов, а потом уже принималось за ввод с клавиатуры. Можно так?

Изначально вообще код был такой
istream &operator>>( istream &ainput, PhoneNumber &number )
{
ainput.ignore(); // skip (
ainput >> setw( 3 ) >> number.areaCode; // input area code
ainput.ignore( 2 ); // skip ) and space
ainput >> setw( 3 ) >> number.exchange; // input exchange
ainput.ignore(); // skip dash (-)
ainput >> setw( 4 ) >> number.line; // input line
return ainput; // enables cin >> a >> b >> c;
}; // end function operator>>
Теперь такой
istream &operator>>( istream &ainput, PhoneNumber &number )
{
char c[15];
ainput.get(c,14);
if (ainput.gcount()<14)
ainput.clear(ios::failbit);
if (c[1]==1 || c[1]==0)
ainput.clear(ios::failbit);
if (c[2]!=0 && c[2]!=1 )
ainput.clear(ios::failbit);
// ВОТ ЗДЕСЬ НАДО БЫ КАК-ТО ПОДПИХНУТЬ В ПОТОК СОДЕРЖИМОЕ МАССИВА СИМВОЛОВ C, НУ КРОМЕ СИМВОЛА '\0' КОНЕЧНО ЖЕ
if (!(ainput.fail()))
{
ainput.ignore(); // skip (
ainput >> setw( 3 ) >> number.areaCode; // input area code
ainput.ignore( 2 ); // skip ) and space
ainput >> setw( 3 ) >> number.exchange; // input exchange
ainput.ignore(); // skip dash (-)
ainput >> setw( 4 ) >> number.line; // input line
return ainput; // enables cin >> a >> b >> c;
}
}; // end function operator>>
Добавлено позже:Написал тут очередное задание по Дейтелу и удостоверился что для проверки данных уходит слишком много усилий. Если интересно
Complex.h
#include <iostream>
using namespace std;
class complex
{
friend istream &operator>>(istream&, complex&);
friend ostream &operator<<(ostream&, const complex&);
public:
complex()
:real(0),image(0)
{
}
private:
int real;
double image;
};
istream &operator>>(istream& input, complex& c)
{
char a[20];
input.get(a,20);
//если получено число либо символ + либо символ i
for (int i=0;i<input.gcount()-1;i++)
if (((((int)a[i])>=48) && (((int)a[i])<=57)) || ((int)a[i]==43) || ((int)a[i]==105)); //то ничего не делаем
else
input.clear(ios::failbit); //иначе установим флаг ошибки
if (a[input.gcount()-1]=='i' && !(input.fail())) //если есть мнимая часть
{
//проверим есть ли реальная часть (будем искать знак +)
for (int i=0;i<input.gcount()-1;i++)
if ((int)a[i]==43) //если плюс найден
{
c.real=atoi(a);
c.image=atoi(&a[i+1]);
}
else //иначе у нас только мнимая часть
c.image=atoi(a);
}
else //иначе у нас нет мнимой части и есть только реальная
if(!(input.fail()))
c.real=atoi(a);
return input;
}
ostream &operator<<(ostream& output, const complex& c)
{
if (cin.fail()) // если при вводе были ошибки
{
output<<"WRONG INFORMATION"<<endl;
return output;
}
if(c.real!=0) // если есть реальная часть
output<<c.real;
if (c.real!=0 && c.image!=0) // если есть и реальная и мнимая части
output<<" + ";
if (c.image!=0) // если есть мнимая часть
output<<c.image<<'i';
output<<endl;
return output;
}
Main.cpp
#include <iostream>
#include "Complex.h"
using namespace std;
int main()
{
complex abc;
cin>>abc;
cout<<abc;
}
Собственно работает, хотя надо бы ещё было добавить наверное проверку что i и знак + встречаются только один раз, но что-то уже не хочеться

Добавлено позже:И ещё один вопрос:
В Дейтеле как-то косвенно упомянута хитрая возможность, вот текст
Элемент-функция operator! из basic_ios возвращает true, если установлен
или badbit, или failbit, или оба бита. Элемент-функция operator void *
возвращает false (О), если установлены badbit и/или failbit. Эти функции удобны
при обработке файлов, когда в операторе выбора или повторения проверяется
условие true/false.
К чему применять оператор
! и что приводить к указателю на void чтобы узнать установлен ли badbit и failbit вместе? Помоему переводчик что-то пропустил, в книге уже такое было не раз, но раньше я дешифровывал что же написано не так, а тут не могу. Подскажите же пожалуйста