ifstream 的意外行为(字数统计)
Unexpected behavior of ifstream (word counting)
我正在尝试测量 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++;
(或者也许是其他人),但我想知道为什么第一个选项失败了。
您的代码存在多个问题
- 以二进制模式打开文件,这使程序依赖于平台。行可能用
'r'
、'n'
或"rn"
分隔。如果在文本模式下打开,则保证行之间用'n'
分隔。 - 打开带有
ios::ate
标志的文件并立即调用seekg(0)
有什么意义?它可以工作,但省略 bithios::ate
和seekg
具有相同的效果,并且要编写和读取的代码更少。 - 您计算的是空格字符(不包括
'r'
),而不是单词。包括双倍空格、行尾'n'
字符等。 - 以及最可能的根本原因 - 未初始化的变量
numWords
.使用它调用未定义的行为。在您的情况下,随机结果是最有可能的效果。
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 为什么 gcovr 会生成空覆盖率统计信息?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- ifstream 的意外行为(字数统计)