Я считаю количество символов в файле, но я хочу подсчитать количество слов, которые меньше 5 и 6 или больше - PullRequest
0 голосов
/ 05 мая 2010

я хочу сделать это: читает слова в файле по одному. (Используйте строку, чтобы сделать это) Считает три вещи: сколько односимвольных слов в файле, сколько коротких (от 2 до 5 символов) слов в файле и сколько длинных (6 или более символов) слов в файле. ПОМОГИТЕ ЗДЕСЬ

Я не уверен, как насчет чтения файла в строку. Я знаю, что должен что-то подобное, но я не понимаю, все остальное. ПОМОГИТЕ ЗДЕСЬ

ifstream infile;
//char mystring[6];
//char mystring[20];

 int main()
    {
        infile.open("file.txt");
            if(infile.fail())
            {
                cout << " Error " << endl;
            }

        int numb_char=0;
        char letter;

                while(!infile.eof())
                {
                    infile.get(letter);
                    cout << letter;
                    numb_char++;
                    break;
                }

    cout << " the number of characters is :" << numb_char << endl;
    infile.close(); 
    return 0;

Ответы [ 5 ]

2 голосов
/ 05 мая 2010

Я не совсем уверен, с чего начать ...

Ваш цикл:

while(!infile.eof())
{
  infile.get(letter);
  cout << letter;
  numb_char++;
  break;
}

Выполнится только один раз из-за дополнительных break;

Также этот код выглядит так, как будто он пытается прочитать количество символов в файле, а не подсчитать количество слов, которые состоят из 5 или более букв.

Попробуйте что-то вроде:

ifstream infile;

int main(){
  infile.open("file.txt");
  if(!infile.good()){
    cout << " Error " << endl;
    return 1;
  }
  int shortCount = 0;
  int mediumCount = 0;
  int longCount = 0;
  int charCount = 0;
  char letter;
  while(!infile.eof()){
    infile >> letter;
    if(letter == ' ' || char == EOF){ // end of word or file.
      if(charCount == 1)
        shortCount++;
      else if(charCount < 6)
        mediumCount++;
      else
        longCount++;
      charCount = 0;
    }else{
      charCount++;
    }
  }
  cout << "Short Words: " << shortCount << endl;
  cout << "Medium Words: " << mediumWords << endl;
  cout << "Long Words: " << longWords << endl;
  infile.close();
  return 0;
}
0 голосов
/ 06 мая 2010
vector<string> words;
int cLength = 0;
long shortWords, medWords, longWords;

boost::algorithm::split(inputString, is_any_of(" .,-_=+;()[]\\/ [etc]"), words, token_compress_on);
for ( unsigned long i = 0; i < words.size(); i++ )
{
    cLength = words[i].size();
    if ( cLength < 2 ) // short word
    {
        shortWords++;
    } else if ( cLength < 6 ) {
        medWords++;
    } else {
        longWords++;
    }
}
0 голосов
/ 06 мая 2010
#include <cctype>
#include <string>
#include <vector>
#include <iostream>
using namespace std;

string s;
vector< int > word_length_histogram;

while ( cin >> s ) // attempt to get a word and stop loop upon failure
{
    while ( ispunct( * --s.end() ) ) s.erase( --s.end() ); // strip punctuation

    if ( s.size() >= word_length_histogram.size() ) {
        word_length_histogram.resize( s.size() + 1 );
    } // make sure there's room in the histogram

    ++ word_length_histogram[ s.size() ];
}

В конце, word_length_histogram[1] имеет количество 1-символьных слов, word_length_histogram[2] имеет количество 2-символьных слов и т. Д. Сложите содержимое диапазонов в пределах word_length_histogram, чтобы получить нужную статистику, которую вы хотите .

0 голосов
/ 05 мая 2010

Как я уже говорил ... вы читаете один символ, а затем выходите из цикла ... не break.

Что касается того, как это сделать ... одним из подходов было бы определение 3 счетчиков: int fiveMinusLetterWord, int sixPlusLetterWord и int singleLetterWord. Количество символов до letter == ' '. Когда вы нажмете пробел, посмотрите, сколько символов вы прочитали - это длина предыдущего слова. При необходимости увеличьте один из ваших счетчиков, сбросьте счетчик символов и продолжайте до конца файла. Не забудьте проверить длину последнего слова после выхода из циклов. Вам также придется иметь дело с разделителями конца строки, поскольку вы читаете по одному символу за раз.

Более простой подход, поскольку это C ++: использовать istream& getline ( istream& is, string& str ); из <string> и читать строку за строкой в ​​std::string, а затем использовать функции std::string для поиска ваших слов.

РЕДАКТИРОВАТЬ: Я пропустил часть в вашем вопросе, которая говорит "читать по одному слову за раз". Посмотрите на другой ответ, вы можете прочитать одно слово из потока, используя std :: string.

0 голосов
/ 05 мая 2010

Может быть проблема с Unicode, вы можете проверить кодировку файла, если это Unicode, вам нужно будет использовать соответствующие методы wfstream и введите wchar_t. Unicode становится все более распространенным, и я не удивлюсь, если бы это было источником вашей проблемы.

...