0

我有一个用于我的高级 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 数组,并且其中有代码可以执行该转换,但在这两种情况下我都会遇到相同的错误. 我知道它正在正确读取文件,因为最终程序还必须执行字符计数(这是有效的),并且它从头到尾完美地读回了目标文档中每一行的大小。反正我没办法,所以我想我会请教更高的权力。有任何想法吗?

4

2 回答 2

3

计算空格很简单:

int spaces = std::count_if(s.begin(), s.end(),
                           [](unsigned char c){ return std::isspace(c); });

不过有两个注意事项:

  1. std::isspace()不能立即使用,char因为char可能会被签名并std::isspace()接受int需要为正的。
  2. 这计算空格的数量,而不是单词的数量(或单词 - 1):单词可以由包含多个连续空格的空格序列分隔。
于 2012-10-18T17:14:58.077 回答
1

这可能是你的循环。你要从 i=0 到 i=c,但 i=c 太远了。你应该去 i=c-1:

for ( i=0; i<c; i++)
于 2012-10-18T17:04:45.950 回答