С++ - подсчет количества гласных в файле

У меня возникли проблемы с реализацией функции, которая подсчитывает и отображает количество гласных в файле.

Вот код, который у меня есть до сих пор.

#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
#include <cstdio>

using namespace std;

int main(void)
{int i;
 string inputFileName;
 string s;
 ifstream fileIn;
 char ch;
 cout<<"Enter name of file of characters :";
 cin>>inputFileName;
 fileIn.open(inputFileName.data());
 assert(fileIn.is_open() );
 i=0;
 while (!(fileIn.eof()))
  {
  ????????????
  }
 cout<<s;
 cout<<"The number of vowels in the string is "<<s.?()<<endl;
 return 0;
}

Обратите внимание на вопросительные знаки в коде. Вопросы: Как я должен считать гласные? Должен ли я преобразовывать текст в нижний регистр и вызывать системные элементы управления (если возможно)? Кроме того, что касается вывода количества гласных в конце, какую строковую переменную следует использовать (см. s.?)?

Спасибо


person csheroe    schedule 13.03.2015    source источник
comment
Вы должны начать со строки выше: while (!(fileIn.eof())). Если вы планируете прочитать файл и просто предполагаете, что чтение прошло успешно и что содержимое соответствует вашим ожиданиям, вам следует переосмыслить это решение. Если вы не планируете этого делать, то eof будет неправильным условием, если только вы не собираетесь игнорировать каждый неверный ввод.   -  person chris    schedule 13.03.2015
comment
Вам нужно будет научиться думать о решении задач с помощью компьютера. Итак, как бы вы подсчитали количество гласных? Вы должны знать, что такое гласная. Это библиотечная функция? Прочитайте список библиотечных функций. Нет библиотечной функции? Составьте себе список гласных и включите его в свою программу. Теперь вам нужно перейти к каждому символу в вашей строке и проверить, является ли он гласным, ища его в списке гласных. Если он есть в списке, добавьте 1 к количеству гласных. Видите, как это может сработать?   -  person Zan Lynx    schedule 13.03.2015


Ответы (3)


Вы можете использовать std::count_if <algorithm> для достижения этого:

std::string vowels = "AEIOUaeiou";

size_t count = std::count_if
       (
            std::istreambuf_iterator<char>(in),
            std::istreambuf_iterator<char>(),
            [=]( char x) 
            {
                return   vowels.find(x) != std::string::npos  ;
            }
        );

Or

size_t count = 0;
std::string vowels = "AEIOUaeiou";
char x ;
while ( in >> x )
{
  count += vowels.find(x) != std::string::npos ;
}

Также прочитайте Почему iostream::eof внутри условия цикла считается неправильным?

person P0W    schedule 13.03.2015

Может ли это помочь?

char c;
int count = 0;
while(fileIn.get(c))
{
    if ((c == 'a') || (c=='e') || .......)
    {
        count++;
    }
}
person 4386427    schedule 13.03.2015

person    schedule
comment
Лично я бы использовал массив поиска или строку для гласных, это более гибко, и это не похоже на то, что в мире есть 1 язык... - person dtech; 13.03.2015
comment
@ddriver isvowel можно легко изменить, чтобы использовать поиск или поддерживать разные языки и т. д., не влияя на остальную часть кода. - person David; 13.03.2015
comment
Спасибо, но поскольку я новичок и немного медленно понимаю это, куда мне вставить это, чтобы оно синхронизировалось с моим кодом? А я думал, что в С++ нет функции isvowel? - person csheroe; 14.03.2015
comment
@csheroe, чтобы понять isvowel в приведенном выше коде, посмотрите, что такое лямбда-выражения и как они работают. Короче говоря, в приведенном выше коде это сокращенный способ написать функцию. Остальное легко найти по именам istreambuf_iterator, count_if, ifstream и т. д. - person David; 14.03.2015