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

Unexpected behavior of ifstream (word counting)

本文关键字:统计 意外 ifstream      更新时间:2023-10-16

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

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 wordsn", numWords);

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

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

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

您的代码存在多个问题

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