2015-04-08 2 views
1

Насколько я знаю, std::cin пропускает все пробелы, это дело со всеми остальными std::istream: std::fstream, std::sstream, std::iostream объектов, пропускают пробелы? Например, если вы хотите читать из файла, содержащего разделенные пробелы пробелы, нужно ли указывать пропуски в том же порядке, что и любая другая структура входного формата?Все istreams пропускают пробелы, как `cin`?

Например, если вы читаете значения в формате (знач1, val2):

char par1, comma, par2; 
double x,y; 
is >> par1 >> x >> comma >> y >> par2; 
// check if any input 
if(!is) return is; 
// check for valid input format 
if (par1 != '(' || comma != ',' || par2 != ')') 

Для пробельных значений, разделенных, вам нужно указать белое пространство как форматы маркера?

int val1; 
char whSp= ' '; // or string whSp = " "; 
is >> val1 >> whSp; 
+1

'cin' - это объект, он ничего не делает. Форматированные операции извлечения - это операции, и они * делают * вещи (например, пропускать пробелы). –

ответ

4

По умолчанию да, хотя это поведение определяется базовым классом std::ios_base. Когда поток инициализирует свой буфер, вызывая init, он также установит флаг skipws (между прочим); этот флаг используется форматированными входными функциями (например, operator>>), чтобы определить, пропускать пробел или нет. Если этот флаг не будет изменен напрямую или через манипулятор, отформатированные функции всегда будут пропускать пробелы.

enter image description here

Как, какие символы считаются пробельные это зависит от ctype грани локали, проникнут в потоке во время вызова функции, по умолчанию, в локали Си (и в самом деле большинство локалей) это \ t, \ n, \ v, \ f, \ r и пространство.

2

Насколько я знаю, cin пропускает все пробелы, это случай со всеми остальными: fstream, sstream, iostream, пропускают пробелы?

Поведение всех стандартных типов потоков (относительно пробелов) одинаково (иначе они нарушили бы принцип замены Лискова).

Например, если вы хотите прочитать из файла, содержащего выделенные пробелы пробелы, вам нужно указать пропуск в том же порядке, что и любая другая структура входного формата?

Это правильный способ сделать это. Вы также можете использовать peek и ignore для пропуска символов.

Для пробелов, разделенных пробелами, нужно указать пробел в качестве маркера формата?

Пример, приведенный ниже, приведен ниже.

В любом случае, чтобы контролировать политику управления пространством, взгляните на std::skipws and std::noskipws ручные манипуляторы.

+0

Так по умолчанию: 'int val1; is >> val1; ' – Ziezi

Смежные вопросы