我正在计算文件中的字符数,但我想计算小于5和6或更大的单词数

时间:2010-05-05 17:58:34

标签: c++ string iostream

我想这样做: 一次读取一个文件中的单词。 (使用字符串执行此操作) 计算三件事:文件中有多少单字符单词,文件中有多少短(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 个答案:

答案 0 :(得分:2)

我不太清楚从哪里开始...

你的循环:

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

由于额外的break;

,只会执行一次

此代码看起来似乎是试图读取文件中的字符数,而不是计算5个字母或大于6个字母的单词数。

尝试类似:

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

答案 1 :(得分:0)

可能是Unicode问题,您可能需要检查文件的编码,如果是Unicode,则需要使用适当的方法wfstream和类型wchar_t。 Unicode正变得越来越普遍,如果这是您问题的根源,我不会感到惊讶。

答案 2 :(得分:0)

正如我所提到的......你正在阅读一个角色然后突破你的循环...不要break

至于如何做到这一点......一种方法是定义3个计数器,int fiveMinusLetterWordint sixPlusLetterWordint singleLetterWord。计算字符直到letter == ' '。当你点击空格时,看看你读过多少个字符 - 这是前一个单词的长度。如果需要,递增一个计数器,重置字符计数器,然后继续执行文件末尾。请记住在循环退出后检查最后一个单词的长度。由于您一次只读一个字符,因此您还必须处理行尾分隔符。

一个更简单的方法,因为这是C ++将使用istream& getline ( istream& is, string& str );中的<string>并逐行读取到std::string然后使用std::string函数来查找单词。

编辑:我在你的问题中错过了“一次只读一个字”的部分。查看另一个答案,您可以使用std :: string从流中读取单个单词。

答案 3 :(得分:0)

#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中的范围内容添加到获得您想要的特定统计数据。

答案 4 :(得分:0)

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