views:

316

answers:

4

My "counter" is jumping from 1 to 4 when I enter my loop. Any ideas? Code and output below:

    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 log format:
-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(Referer): 0. COUNT: 6
-7-cs-uri-stem: 0. cs(Referer): 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
Found field cs-uri-stem at position 10.
Found field cs(Referer) at position 16.

A: 

You haven't provided all code in your loop - there's an unmatched open curly brace after the while statement. Do you have some cout code below what you've extracted?

Pontus Gagge
I apologize, I have now included the entire function. I was trying to narrow in on the problem, but it's not worth the trouble caused by lacking externalities.
Nona Urbiz
+6  A: 

I would bet that it's going throught the

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

and you never reset it after this branch

Carlos Tasada
thank you, stupid error. +1 to you.
Nona Urbiz
+1  A: 

Can't you attach a debugger and step through the code? It doesn't look like you are going to have many iterations to go through to see the answer. (If this Visual Studio you could set a data break point on count at just hit run. I suspect GDB and most other debuggers will also support this.)

Ian G
A: 

Perhaps your if statement right after the while loop begins comes back false? The else attached to that if contains a count++ statement in a loop.

Lord Torgamus