我正在尝试测量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++;
(或者其他人)但我想知道为什么第一个选项失败。
答案 0 :(得分:2)
您的代码存在多个问题
'\r'
,'\n'
或"\r\n"
分隔。如果您在文本模式下打开,则保证使用'\n'
分隔行。ios::ate
标志打开文件并立即调用seekg(0)
是什么意思?它有效,但省略bith ios::ate
和seekg
具有相同的效果,并且编写和读取的代码更少。'\r'
),而不是单词。包括双倍空格,行尾有'\n'
个字符,类似。numWords
。使用它会调用未定义的行为。在你的情况下,随机结果是最可能的结果。