2015-03-13 3 views
0

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

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

#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.?)?

Благодаря

+0

Вы должны начать с строки выше: 'while (! (FileIn.eof()))'. Если вы планируете прочитать файл и просто считаете, что чтение преуспевает, и что содержимое - то, что вы ожидаете, вы должны пересмотреть это решение. Если вы не планируете это делать, то 'eof' является неправильным условием, если вы не будете игнорировать каждый недействительный ввод. – chris

+0

Вам нужно научиться думать о решении проблем с компьютером. Итак, как бы вы посчитали количество гласных? Вам нужно знать, что такое гласный. Это функция библиотеки? Прочтите список функций библиотеки. Нет библиотечной функции? Сделайте себе список гласных и поместите их в свою программу. Теперь вам нужно перейти к каждому символу в вашей строке и проверить, является ли он гласным, ища его в списке гласных. Если он находится в списке, добавьте 1 к вашему количеству гласных. Посмотрите, как это может работать? –

ответ

4
auto isvowel = [](char c){ return c == 'A' || c == 'a' || 
            c == 'E' || c == 'e' || 
            c == 'I' || c == 'i' || 
            c == 'O' || c == 'o' || 
            c == 'U' || c == 'u'; }; 

std::ifstream f("file.txt"); 

auto numVowels = std::count_if(std::istreambuf_iterator<char>(f), 
           std::istreambuf_iterator<char>(), 
           isvowel); 
+0

Я бы лично пошел с массивом поиска или строкой для гласных, это более гибко, и это не похоже на то, что в мире есть 1 язык ... – dtech

+0

@ddriver 'isvowel' можно легко изменить, чтобы использовать поиск , или поддерживать разные языки и т. д., не влияя на остальную часть кода. – David

+0

Спасибо, но поскольку я новичок и немного медленно понимаю это, где я должен вставить это, чтобы он синхронизировался с моим кодом? И я думал, что C++ не имеет функции isvowel? – csheroe

2

Вы можете с помощью <algorithm> «s std::count_if для достижения этой цели:

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 ; 
      } 
     ); 

Или

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

Также читайте Why is iostream::eof inside a loop condition considered wrong?

0

Это может помочь?

char c; 
int count = 0; 
while(fileIn.get(c)) 
{ 
    if ((c == 'a') || (c=='e') || .......) 
    { 
     count++; 
    } 
} 
Смежные вопросы