У меня есть небольшая программа, которая считает слова, я знаю как она работает, но не совсем понимаю как именно устроен механизм. Конкретно меня интересует оператор >> в условие 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;
}
Вкратце, для типа 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;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Написала код программы для этой задачи,а она выдает ошибку,подскажите что не такИ не прописала два последних условия- E-сбит ровно один истребитель,F-сбит...
Есть Crypto API, есть сертификат, есть данныеНеобходимо получить подпись
Немогу понять в чем разница между следующими двумя операторами
Какие аргументы и код возврата имеет оператор преобразования типа? В каких случаях неизбежно его использование?