gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:41:34 27 4
gpt4 key购买 nike

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

关于c++ - ifstream 的意外行为(字数统计),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46904664/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com