Почему int count перепрыгивает с 1 до 4 при входе в цикл? C ++ - PullRequest
0 голосов
/ 18 сентября 2009

Мой "счетчик" прыгает с 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-Найденный формат журнала:
-4-cs-uri-stem: 0. cs (Referer): 0. COUNT:4
-5-cs-uri-stem: 0. cs (рефери): 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 (рефери): 0. COUNT: 8
-9-cs-uri-stem: 0. cs (рефери): 0. COUNT: 9
-10-cs-uri-stem: 10. cs (рефери): 0. COUNT: 10
-11-cs-uri-stem: 10. cs (рефери): 0. COUNT: 11
-12-cs-uri-stem: 10. cs (рефери): 0. COUNT: 12
-13-cs-uri-stem: 10. cs (рефери): 0. COUNT: 13
-14-cs-uri-stem: 10. cs (рефери): 0. COUNT: 14
-15-cs-uri-система: 10. cs (рефери): 0. COUNT: 15
-16-cs-uri-stem: 10. cs (рефери): 16. COUNT: 16
-17-cs-uri-stem: 10. cs (рефери): 16. COUNT: 17
-18-cs-uri-stem: 10. cs (рефери): 16. COUNT: 18
-19-cs-uri-stem: 10cs (рефери): 16. COUNT: 19
-20-cs-uri-stem: 10. cs (рефери): 16. COUNT: 20
найдено поле cs-uri-stem в положении10.
Найдено поле cs (Referer) в позиции 16.

Ответы [ 4 ]

6 голосов
/ 18 сентября 2009

Могу поспорить, что это пройдет через

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

и вы никогда не сбросите его после этой ветки

1 голос
/ 18 сентября 2009

Не можете ли вы присоединить отладчик и пройтись по коду? Не похоже, что вам придется пройти много итераций, чтобы увидеть ответ. (Если в Visual Studio вы могли бы установить точку останова для данных на счетчике при выполнении только запуска. Я подозреваю, что GDB и большинство других отладчиков также поддержат это.)

0 голосов
/ 18 сентября 2009

Возможно, ваше утверждение if сразу после начала цикла while возвращается false? Остальное, прикрепленное к этому if, содержит в цикле оператор count ++.

0 голосов
/ 18 сентября 2009

Вы не предоставили весь код в своем цикле - после оператора while есть непревзойденная открытая фигурная скобка. У вас есть какой-то код ниже того, что вы извлекли?

...