这都不明显,但在Mac(因此它可能不适用于Linux的,但我相信它)上,我可以得到相同的结果wc通过setlocale(LC_ALL, ""):调用您的计数功能之前。
另一个问题是,正如我在评论中指出的那样,该isspace()整数取0..255或EOF范围内的整数,但是当您从plain获得有符号值时char,您索引的范围超出了范围,那么您得到的一切(它是未定义的行为)。在没有setlocale()呼叫的情况下,字符代码9(制表符'\t'),10(换行符'\n'),11(垂直制表符'\v'),12(换页符'\f'),13(回车符'\r')和32(空格' ')被视为“空格”由isspace()。在setlocale()Mac上调用该函数时,字符代码160(NBSP-不间断空格)也计为一个空格,并使计算与同步wc。
这是您的函数的轻度修改版本,它计算行和字符以及单词。该函数被修改为带有文件名参数-您可以随自己的意愿进行操作,但应尽可能避免使用全局变量。
#include
#include
#include
#include
int countWords(const char *pathToFile)
{
std::ifstream myFile(pathToFile);
char buffer[1];
enum states { WHITESPACE, WORD };
int state = WHITESPACE;
int wordCount = 0;
int cc = 0;
int lc = 0;
if (myFile.is_open())
{
while (myFile.read(buffer, 1))
{
cc++;
if (buffer[0] == '\n')
lc++;
if (!isspace(static_cast(buffer[0])))
{
if (state == WHITESPACE)
{
wordCount++;
state = WORD;
}
}
else
{
state = WHITESPACE;
}
}
myFile.close();
std::cerr <
<< ", wc = " << wordCount << "\n";
}
else
{
throw std::runtime_error("File has not opened");
}
return wordCount;
}
int main()
{
setlocale(LC_ALL, "");
std::cout << countWords("/dev/stdin") << "\n";
}
编译(从wc79.cpp到wc79)并自行运行时,我得到的输出是:
$ ./wc79 < wc79
cc = 13456, lc = 6, wc = 118
118
$ wc wc79
6 118 13456 wc79
$
两者现已达成协议。