2016-06-28 2 views
0

У меня есть вопрос относительно оператора >>.
Я написал программу для подсчета количества слов в двоичном файле.
Мой вопрос о цикле while, не должен ли >> читать пробел, идти в цикл, увеличивать c, но просто не помещать ничего в w?
Он дает мне выход 4, но подсчет пробелов не должен быть 10?
Любая помощь приветствуется. Мой код ниже:C++ - Как работает оператор >>?

#include<iostream.h> 
#include<conio.h> 
#include<fstream.h> 
ofstream a; 
ifstream b; 
void main() 
{ 
    clrscr(); 
    char w[20]; 
    a.open("newf.txt",ios::binary); 
    a<<"This is an example\n"; 
    a.close(); 
    b.open("newf.txt"); 
    int c=0; 
    while(b>>w) 
    { 
     c++ ; 
    } 
    cout<<c; 
    b.close(); 
    getch(); 
} 
+3

Большинство перегрузок 'operator >>' (включая тот, который вы вызываете) [пропустить все ведущие пробелы первой вещи] (http://en.cppreference.com/w/cpp/concept/FormattedInputFunction). –

+0

Я не уверен, что вы знаете об этом, но используете устаревшие заголовки. Например, '' следует использовать вместо '''. – buratino

+0

См. Также: http://en.cppreference.com/w/cpp/io/manip/skipws –

ответ

3

По умолчанию оператор >> в ifstream игнорирует пробельные. Если вы хотите включить пробелы, вы должны использовать флаг манипулятора std :: noskipws, как показано в официальной документации here.

1

Во-первых, вы извлекаете в char w[20]не делаете этого. Если удастся укусить более 20 символов, произойдет что-то плохое. Вместо этого используйте string w.

string::operator>> является то, что называют b >> w которые:

Ведет себя как FormattedInputFunction. После построения и проверки объекта сторожевую, который может пропускать ведущие пробелы, первый очищает str с str.erase(), затем читает символы из is и добавляет их к str как будто str.append(1, c), пока один из следующих условий становится истинным:

  • N символов считываются, где N является is.width() если is.width() > 0, в противном случае N является str.max_size()
  • состояние с истекшим файла происходит в потоке is
  • std::isspace(c,is.getloc()) верно для следующего символа c в is (этот пробельный символ остается во входном потоке).

Если никакие символы не будут извлечены, то std::ios::failbit устанавливается на is, который может бросить std::ios_base::failure.

И наконец, вызывает os.width(0), чтобы отменить эффекты std::setw, если таковые имеются.

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