2016-11-04 10 views
0

Я уверен, что неправильно написал код для двух функций в своем классе. Я смущен, как правильно взять только две части данных (x и y) и убедиться, что они находятся в хорошем состоянии.Confused Как сделать достоверные данные «Хорошо» в IOStream

/** 
* Requires: ins is in good state. 
* Modifies: ins, x, y. 
* Effects: Reads point in form (x,y). 
*/ 
void read(istream& ins); 

/** 
* Requires: outs is in good state. 
* Modifies: outs. 
* Effects: Writes point in form (x,y). 
*/ 
void write(ostream& outs); 


void Point::read(istream& ins) { 
char junk; 
char junk2; 
char junk3; 
while (cin.good()) { 
    cin >> junk >> x >> junk2 >> y >> junk3; 
} 
} 

void Point::write(ostream& outs) { 
while (cout.good()) { 
    cout << "(" << x << "," << y << ")"; 
} 
} 
+0

Что такое 'x' и' y'? –

+0

Это точки в координате (x, y). – NICE8xxx

+0

А-ха. Теперь ты полностью просветил меня. Разум, отправляющий [MCVE], который воспроизводит вашу актуальную проблему по мере необходимости? –

ответ

0

Вы можете использовать функцию istream's .bad() после прочтения, чтобы определить, существует ли проблема. «Проблемы могут быть логической ошибкой при операции ввода/вывода» (failbit) или «Ошибка чтения/записи при работе с вводом/выводом» (badbit).

Ниже я заменил cin на ins, поскольку вы передали его в качестве аргумента, и он явно должен быть объектом istream, из которого вы должны извлечь. Я также добавил локальные переменные (используя символ подчеркивания в качестве префикса), а затем скопируйте только x и y, если ошибок не было.

Если обнаружена ошибка, вы можете просто «вернуться», однако у пользователя не будет указаний о том, что произошла ошибка чтения, а x/y не были затронуты. В качестве альтернативы я выбрал исключение, но вы также можете выбрать сообщение cout/cerr, затем вернуть или выбрать возврат результата (успех/сбой) вместо использования возврата void и позволить вызывающей функции обрабатывать ошибку.

void Point::read(istream& ins) { 
    char _junk; 
    int _x, _y; 

    ins >> _junk >> _x >> _junk >> _y >> _junk; 

    if (ins.bad()) 
    throw "Error"; 

    x = _x; // Assuming x and y are members of class Point 
    y = _y; 
} 

Для функции Point::write, не беспокоить с циклом. Обычно я не проверяю объекты ostream, но если вы действительно этого хотите, тогда просто проверьте, истинно ли значение .good() до и после вашего написания. Если вы обнаружите проблему, вы можете обрабатывать ошибку, как вам нравится; return, throw исключение и/или зарегистрировать ошибку.