0

ループに入ると、「カウンター」が 1 から 4 にジャンプします。何か案は?以下のコードと出力:

    static bool harvestLog()
{
    ifstream myFile("LOGS/ex090716.log");
    if (myFile.fail()) {cout << "Error opening file";return 1;}
    else
    {
        cout << "File opened... \n";
        string line;
        string field;
        int cs_uri_stemLocation = 0;
        int csReferrerLocation = 0;
        int count = 1;
        cout << "-" << count << "-";
        while( getline(myFile, line) ) {
            if ( strstr(line.c_str(), "cs-uri-stem") &&
                (strstr(line.c_str(), "cs(Referer)") || strstr(line.c_str(), "cs(Referrer)")) )
            {
                cout << "-" << count << "-";
                cout << "Found log format: \n";
                istringstream foundField(line);
                while (!foundField.eof())
                {
                    cout << "-" << count << "-";
                    foundField >> field;
                    if (field == "cs-uri-stem") {cs_uri_stemLocation = count;}
                    if (field == "cs(Referer)" || field == "cs(Referrer)") {csReferrerLocation = count;}
                    cout << "cs-uri-stem: " << cs_uri_stemLocation << ". ";
                    cout << "cs(Referer): " << csReferrerLocation << ". ";
                    cout << "COUNT: " << count << endl;
                    count++;
                }
                cout << "Found field cs-uri-stem at position " << cs_uri_stemLocation << "." << endl;
                cout << "Found field cs(Referer) at position " << csReferrerLocation << "." << endl;
                count = 1;
            }
            else
            {
                count = 1;
                istringstream foundField(line);
                while (!foundField.eof())
                {
                    foundField >> field;
                    //if (count == cs_uri_stemLocation) cout << field << endl;
                    count++;
                }

                //cmatch results;
                //regex rx("(?:p|q)(?:=)([^ %]*)");
                //regex_search(line.c_str(), results, rx);
                //string referringWords = results[1];

                //cout << referringWords;
            }
        }
    myFile.close();
    return 0;
    }
}

-1--4-Found ログ形式:
-4-cs-uri-stem: 0.cs(Referer): 0.COUNT: 4
-5-cs-uri-stem: 0.cs(Referer): 0.COUNT : 5
-6-cs-uri-stem: 0. cs(リファラー): 0. COUNT: 6
-7-cs-uri-stem: 0. cs(リファラー): 0. COUNT: 7
-8-cs-uri -stem: 0. cs(Referer): 0. COUNT: 8
-9-cs-uri-stem: 0. cs(Referer): 0. COUNT: 9
-10-cs-uri-stem: 10. cs(Referer ): 0. COUNT: 10
-11-cs-uri-stem: 10. cs(Referer): 0. COUNT: 11
-12-cs-uri-stem: 10. cs(Referer): 0. COUNT: 12
- 13-cs-uri-stem: 10. cs(Referer): 0. COUNT: 13
-14-cs-uri-stem: 10. cs(Referer): 0. COUNT: 14
-15-cs-uri-stem: 10. cs(Referer): 0. COUNT: 15
-16-cs-uri-stem: 10. cs(Referer): 16. COUNT: 16
-17-cs-uri-stem: 10. cs(Referer): 16. COUNT: 17
-18-cs-uri-stem: 10. cs(Referer): 16. COUNT: 18
-19-cs-uri-stem : 10. cs(Referer): 16. COUNT: 19
-20-cs-uri-stem: 10. cs(Referer): 16. COUNT: 20
フィールド cs-uri-stem が位置 10 に
見つかりました。 フィールド cs(Referer) が見つかりました) 16 位。

4

4 に答える 4

6

私はそれが通り抜けているに違いない

                        while (!foundField.eof())
                        {
                                foundField >> field;
                                //if (count == cs_uri_stemLocation) cout << field << endl;
                                count++;
                        }

このブランチの後にリセットすることはありません

于 2009-09-18T15:33:44.023 に答える
1

デバッガーを接続してコードをステップ実行できませんか?答えを見るために何度も繰り返す必要があるようには見えません。(このVisual Studioの場合、実行をヒットするだけでカウントにデータブレークポイントを設定できます。GDBや他のほとんどのデバッガーもこれをサポートしていると思います。)

于 2009-09-18T15:39:48.567 に答える
0

おそらく、whileループが始まった直後のifステートメントがfalseに戻ってきますか?それに付随するelseは、ループ内にcount++ステートメントが含まれている場合。

于 2009-09-18T15:40:20.383 に答える
0

ループ内のすべてのコードを提供していません。while ステートメントの後に、一致しない開き中括弧があります。抽出したものの下に cout コードがありますか?

于 2009-09-18T15:31:12.453 に答える