Как работает оператор >> в fstream?

237
19 декабря 2016, 19:50

У меня есть небольшая программа, которая считает слова, я знаю как она работает, но не совсем понимаю как именно устроен механизм. Конкретно меня интересует оператор >> в условие while. За счет чего происходит движение курсора по тексту и как он определяет, что символы отделены пробелами? Как мне дополнить этот код, что бы пробежаться посимвольно и посчитать пробелы?

#include "stdafx.h"
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main(array<System::String ^> ^args){
    ifstream ifs("text.txt", fstream::binary);  
    if(!ifs) {  
        cout << "No such file." << endl;
        system("pause");
        return 1;
    }
    string word;
    int count = 0;
    while (ifs >> word) {
        count++;     
    }
    cout << "Number of words is " << count << "." << endl;
    system("pause");
    return 0;
}
Answer 1

Вкратце, для типа string в стандартной библиотеке перегружен оператор:

istream& operator>> (istream& is, string& str)

Он считывает символы из потока в строку пока не встретит пробельный символ (пробел, табуляцию, перевод строки, может что-то еще).

Если же говорить поподробней, то в стандарте сказано, что перегружен оператор

template <class charT, class traits, class Allocator>
basic_istream<charT, traits>&
operator>>(basic_istream harT, traits>& is,
           basic_string<charT, traits, Allocator>& str);

и считывает он пока не:

isspace(c,is.getloc()) is true for the next available input character c.

Если же мы пытаемся считать из пустого потока, то для потока устанавливается failbit, и условие (bool)is становится ложным, поэтому цикл останавливается.

Если вы хотите посчитать пробелы, можете читать символы из потока посимвольно:

char c;
while (ifs >> c) {
  if (c == ' ') {
    ++num_of_spaces;
  }
}
READ ALSO
1 error C2143: синтаксическая ошибка: отсутствие &ldquo;;&rdquo;

1 error C2143: синтаксическая ошибка: отсутствие “;”

Написала код программы для этой задачи,а она выдает ошибку,подскажите что не такИ не прописала два последних условия- E-сбит ровно один истребитель,F-сбит...

168
Crypto API: Подписать данные сертификатом

Crypto API: Подписать данные сертификатом

Есть Crypto API, есть сертификат, есть данныеНеобходимо получить подпись

221
Выделение памяти с помощью операции new

Выделение памяти с помощью операции new

Немогу понять в чем разница между следующими двумя операторами

234
Оператор преобразования типа

Оператор преобразования типа

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

305