linux c 函数 wc,在C ++中在Linux上以wc的形式对基于非文本文件的单词计数实现

这都不明显,但在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

$

两者现已达成协议。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值