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();
    }

1つの問題を除いて、これはすべて機能します。プログラムを実行してファイルを開こうとすると、インデックスが範囲外であることを示すエラーが表示されます。さて、それが何を意味するかはわかりますが、問題がどのように発生しているのかわかりません。そして、何が問題を引き起こしているのかわからない場合、それを修正することはできません。forループを使用して文字列を検索できることを読みました。もちろん、これはchar配列にも当てはまり、その変換を実行するコードがそこにありますが、どちらの場合も同じエラーが発生します. 最終的なプログラムは文字カウントも実行する必要があり (これは機能しています)、ターゲット ドキュメントの各行のサイズを最初から最後まで完全に読み戻すため、ファイルを正しく読み取っていることがわかります。とにかくアイデアが尽きたので、上位勢力に相談しようと思いました。何か案は?

4

2 に答える 2

3

空白のカウントは簡単です:

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

ただし、次の 2 つの注意事項があります。

  1. std::isspace()は署名されている可能性があり、正であることが必要な を使用するcharため、すぐに使用することはできません。charstd::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 に答える