Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字数-忽略/减去双空格_C++_String_Codeblocks_Fstream - Fatal编程技术网

C++ 字数-忽略/减去双空格

C++ 字数-忽略/减去双空格,c++,string,codeblocks,fstream,C++,String,Codeblocks,Fstream,我试图学习一些编码来扩大我的知识面,我似乎遇到了一个难题 我试图创建一个程序来输出从文件中读取的字符、数字、标点符号、空格、单词和行的数量 这是我正在阅读的文本文件。 See Jack run. Jack can run fast. Jack runs after the cat. The cat's fur is black. See Jack catch the cat. Jack says, "I caught the cat." The cat says, "Meow!"

我试图学习一些编码来扩大我的知识面,我似乎遇到了一个难题

我试图创建一个程序来输出从文件中读取的字符、数字、标点符号、空格、单词和行的数量

这是我正在阅读的文本文件。

  See Jack run. Jack can run fast. Jack runs after the cat. The cat's fur is black. See Jack catch the cat.
  Jack says, "I caught the cat."
  The cat says, "Meow!"
  Jack has caught 1 meowing cat. Jack wants 5 cats, but can't find any more.
这是我的代码

  #include <iostream>
  #include <fstream>

  using namespace std;

  int main()
  {
  ifstream lab3;
  string word;
  lab3.open("lab3.txt");
  int countletters=0,countnum=0,countpunc=0,countspace=0,words=0,line=0;
  char character;
  if(!lab3)
  {
  cout << "Could not open file" << endl;
  return 1;
  }
  while(lab3.get(character) && !lab3.eof())
  {
  if(isalpha(character))
  {
  countletters++;
  }
  if (isdigit(character))
  {
  countnum++;
  }
  if (ispunct(character))
  {
  countpunc++;
  }
  if (isspace(character))
  {
  countspace++;
  }
  if (isalpha(character) && (isspace(character++) || ispunct(character++)))
  {
  words++;
  }
  if(character=='\n')
  {
  line++;
  }
  }
  cout << "There are " << countletters << " letters." << endl;
  cout << "There are " << countnum << " numbers." << endl;
  cout << "There are " << countpunc << " punctuations." << endl;
  cout << "There are " << countspace << " spaces." << endl;
  cout << "There are " << words << " words." << endl;
  cout << "There are " << line << " sentences." << endl;
  lab3.close();
  return 0;
  }
我希望能学到一些东西:

  • 解释为什么字数计数不起作用,并用考虑双空格的工作代码替换
  • 关于我的代码的改进建议,用于学习目的/效率
  • 从文本文件中读取信息的说明。无论是字母、数字、标点符号,无论你在做这种编码时遇到什么
  • 我知道的一些事情:

  • 使用名称空间std不是好的实践-什么是现实世界应用程序的最佳实践
  • 我是一个初学者,这可能不是最好的编码

  • `提前感谢您的帮助和建议:)

    我还不能发表评论,所以我发布了一个答案,但我知道这不是一个真正的答案,因为我指的是另一个帖子

    像在这里一样计算空白的匹配项会给你一个字数

    您可能还可以修改此解决方案以计算其他项目

    没有正则表达式。。。 由于在字符之间循环,因此可以设置一个标记来跟踪空格,并在到达另一个非空格时增加字数

    我相信,在代码中加入这些内容来替换wordcount和spacecount部分应该可以工作。您需要在顶部添加一个名为spaceflag的int。为了得到准确的总数,您可能需要在字数中加上一个

    if(isspace(字符))
    {
    countspace++;
    spaceflag=1;
    }
    else//else说这不是一个空间。
    {
    if(spaceflag==1)//如果设置了spaceflag,并且我们遇到了不同类型的字符,那么我们就将其转换为一个新词。
    words++;
    spaceflag=0;//重置spaceflag,直到找到下一个。
    }
    
    如果(character=='\n')
    因为获取下一个字符的方法是通过
    lab3.get(character)
    ,则在字数检查中增加字符不会获取下一个字符,只需更改您拥有的字符的值

    <> P>而不是尝试“向前看”,考虑保留最后一个字符并检查它,以在下面的迭代中检测单词的结尾。
    if(ispunt(字符))
    {
    c++;
    if(isaalpha(prevchar))
    {
    words++;
    }
    } if(i空间(字符)) { countspace++; if(isaalpha(prevchar)) { words++; }
    }

    在循环开始之前,将
    prevchar
    初始化为零,然后在所有检查之后在循环内部将其设置为等于
    character


    还请注意,数字检查实际上是捕获数字,因此数据中的值10将在输出中计为2个数字,而不是1个。

    其他方面不确定,但在诸如:std::string之类的词之前添加名称空间更好,因为不同的名称空间可以使用相同的词/建议对我的代码进行改进以达到学习目的/效率。/应该在CoDeEvIEW()中询问为什么<代码>字符< /代码>递增,更不用说隐藏在<代码>的中间,如果?你的输出是什么,以及你期望得到什么?@克里斯我试图说一些对…的影响。如果(character=letter和next character=space或next character=标点符号){Words++{我只是浏览了一下你的代码,所以这只是一个猜测,但我认为现在发生的是,你正在推进指针以查看下一个字符(看看你是否在单词边界上),但在您这样做之后,不会在流中倒带位置。我现在不熟悉“regex”,我更喜欢在开始合并内置函数之前坚持基本的编码。非常感谢您,该代码修复了结果。我将修改数字检查,以解释超过个位数的数字。非常感谢。您可以通过创建变量“in_word”、“in_numb”、“in_punt”、“in_space”来解决所有这些问题。以其所有值FALSE开始。如果遇到的第一个字符是alpha,请将\u word更改为TRUE。继续检查,直到下一个字符不再是alpha,然后将\u word更改为FALSE,增加字数,并根据找到的字符启用相应的其他变量。仅增加字数,这些变量改变状态时的计数等。
    There are 167 letters.
    There are 2 numbers.
    There are 18 punctuations.
    There are 52 spaces.
    There are 0 words.
    There are 4 sentences.