ifstream的意外行为(字数统计)

时间:2017-10-24 07:30:46

标签: c++ string char ifstream

我正在尝试测量txt文件中的总字数。该文件是随机的,由10个长度为3到10的单词组成,由code生成。特定行中的单词由单个空格分隔。现在,我测量文件中单词总数的方式是:

ifstream inputFile("myfile.txt", ios::in | ios::binary | ios::ate );

//Count number of total words in input file
long unsigned int numWords;
inputFile.seekg(0);
char c;
while (inputFile.get(c)){
    if (isspace(c) && c != '\r') numWords++;
}

//Test
printf("\nSampled file has %lu words\n", numWords);

如果我多次运行上面的代码,其中一半得到正确的结果,一半是随机数。我知道有更优雅的方法可以做到这一点,如

string word;
long unsigned int ctr = 0;
while (inputFile >> word) ctr++;

(或者其他人)但我想知道为什么第一个选项失败。

1 个答案:

答案 0 :(得分:2)

您的代码存在多个问题

  1. 您以二进制模式打开文件,这会使您的程序依赖于平台。行可能由'\r''\n'"\r\n"分隔。如果您在文本模式下打开,则保证使用'\n'分隔行。
  2. ios::ate标志打开文件并立即调用seekg(0)是什么意思?它有效,但省略bith ios::ateseekg具有相同的效果,并且编写和读取的代码更少。
  3. 您正在计算空格字符(不包括'\r'),而不是单词。包括双倍空格,行尾有'\n'个字符,类似。
  4. 最可能的根本原因 - 未初始化的变量numWords。使用它会调用未定义的行为。在你的情况下,随机结果是最可能的结果。