如何在一个while循环中使用多个函数?

时间:2016-12-27 14:44:02

标签: c++ xcode visual-studio

我正在尝试打开一个文本文件并尝试计算文件中的字符和单词的数量,我创建了“while(!infile.eof());”以扫描整个文件直到结束。然而,只有一个功能正常工作,而另一个也打印出与第一个相同的答案。

#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

int main()
{

ifstream infile;
infile.open("tomorrow.txt");


int count1_char = 0;
int count2_word = 0;

while (!infile.eof())
{
    {
        char ch;
        infile.get(ch);  //number of characters
        count1_char++;
    }
    {
        char word[30];
        infile >> word; //numner of words
        count2_word++;
    }

} 
cout << " the number of characters :" << count1_char << endl;
cout << " the number of words :" << count2_word << endl;

infile.close();

return 0;
}

输出:    字符数:17    单词数:17    按任意键继续 。 。

1 个答案:

答案 0 :(得分:5)

由于单词由字符组成,因此您无法分别读取字符和单词。您应采取以下两种方法之一:

  • 读取字词,并将其长度添加到字符数 - 这种方法非常简单,但您的代码无法控制分隔符,或
  • 读取字符,找到分隔符以决定一个单词何时结束,另一个单词何时开始 - 这稍微复杂一点,但您的程序仍可完全控制其输入。

第一种方法的优点是简单;第二种方法的优点是能够正确计算空白字符。

第二种方法要求您保持一个“状态”,以便您区分当前字符是新单词的一部分还是先前找到的单词的延续。一个简单的标志就足够了。您将有一个循环逐个读取字符,将每个字符分类为空格或非空格(例如,使用std::isspace函数),增加字符数,并执行以下三项操作之一:

  • 如果您看到空格,请将“在单词内”标记为“false”
  • 如果你看到一个非空格,并且“在一个单词里面”标志是“真”,那就什么都不做了
  • 如果您看到非空格,并且“在单词内”标志为“false”,请将其设置为“true”,并增加字数。