我有一个高级c ++类的项目应该做很多事情,但我首先要关注这个函数,因为在它工作之后我可以调整它以满足其他需求。此功能搜索文件并通过计算文档中出现的次数来执行字数统计。也许不准确,但它将是一个很好的起点。这是我现在的代码:
void WordCount()
{
int count_W = 0; //Varaible to store word count, will be written to label
int i, c = 0; //i for iterator
ifstream fPath("F:\Project_1_Text.txt");
FileStream input( "F:\Project_1_Text.txt", FileMode::Open, FileAccess::Read );
StreamReader fileReader( %input );
String ^ line;
//char ws = ' ';
array<Char>^ temp;
input.Seek( 0, SeekOrigin::Begin );
while ( ( line = fileReader.ReadLine() ) != nullptr )
{
Console::WriteLine( line );
c = line->Length;
//temp = line->ToCharArray();
for ( i = 0; i <= c; i++)
{
if ( line[i] == ' ' )
count_W++;
}
//line->ToString();
}
//Code to write to label
lblWordCount->Text = count_W.ToString();
}
除了一个问题外,所有这些都有效。当我尝试运行该程序,并打开该文件时,我收到一个错误,告诉我索引超出范围。现在,我知道这意味着什么,但我不知道问题是如何发生的。而且,如果我不知道是什么导致了这个问题,我无法修复它。我已经读过可以使用for循环搜索字符串,当然对于char数组也是如此,并且在那里有代码来执行该转换,但在这两种情况下我都得到相同的错误。我知道它正在正确读取文件,因为最终程序还必须执行字符计数(这是有效的),并且它从头到尾完美地读回目标文档中每一行的大小。无论如何,我没有想法,所以我认为我会咨询更高的权力。有什么想法吗?
答案 0 :(得分:3)
计算空格很简单:
int spaces = std::count_if(s.begin(), s.end(),
[](unsigned char c){ return std::isspace(c); });
但有两点说明:
std::isspace()
无法立即与char
一起使用,因为char
可能会被签名而std::isspace()
需要int
才能获得肯定。答案 1 :(得分:1)
这可能是你的循环。你从i = 0到i = c,但是i = c太远了。你应该去i = c-1:
for ( i=0; i<c; i++)