2009-09-18 13 views
0

Mon "compteur" saute de 1 à 4 quand j'entre dans ma boucle. Des idées? Code et de sortie ci-dessous:Pourquoi le compte int saute-t-il de 1 à 4 en entrant dans une boucle? C++

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 format de journal:
-4-cs-uri-stem: 0. cs (Referer): 0. COUNT: 4
- 5-cs-uri-stem: 0. cs (Referer): 0. COUNT: 5
-6-cs-uri-racine: 0. cs (Referer): 0. COUNT: 6
-7-cs- uri-stem: 0. cs (Referer): 0. COUNT: 7
-8-cs-uri-tige: 0. cs (Referer): 0. COUNT: 8
-9-cs-uri-tige: 0. cs (Referer): 0. COMPTE: 9
-10-cs-uri-stem: 10. cs (Referer): 0. COUNT: 10
-11-cs-uri-racine: 10. cs (Referer): 0. COUNT: 11
-12- cs-uri-stem: 10. cs (Referer): 0. COUNT: 12
-13-cs-uri-racine: 10. cs (Referer): 0. COUNT: 13
-14-cs-uri- tige: 10. cs (Referer): 0. NOMBRE: 14
-15-cs-uri-tige: 10. cs (Referer): 0. NOMBRE: 15
-16-cs-uri-stem: 10. cs (Referer): 16. COUNT: 16
-17-cs-uri-tige: 10. cs (Referer): 16. COUNT: 17
-18-cs-uri-tige: 10. cs (Referer) : 16. COMPTE: 18
-19-cs-uri-ste m: 10. cs (Referer): 16. COUNT: 19
-20-cs-uri-tige: 10. cs (Referer): 16. COUNT: 20
Champ trouvé cs-uri-tige en position 10.
champ Trouvé cs (Referer) à la position 16.

+1

Essayé LogParser? http://www.microsoft.com/DownLoads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=fr –

+0

Voulez-vous écrire le mien en fait. Avec un peu de fonctionnalité ajoutée ;-) –

+1

On dirait que vous manquez l'accolade de fin sur votre boucle while. Est-ce que vous le fermez juste après l'instruction if ou y a-t-il plus dans la boucle while? – ristonj

Répondre

6

Je parie que ça va throught le

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

et vous ne le réinitialiser après cette branche

+0

merci, erreur stupide. +1 à vous. –

0

Vous n'avez pas fourni tout le code dans votre boucle - il y a une accolade inégalée ouverte après l'instruction while. Avez-vous un code cout inférieur à ce que vous avez extrait?

+0

Je m'excuse, j'ai maintenant inclus la fonction entière. J'essayais de cerner le problème, mais cela ne vaut pas le problème causé par le manque d'externalités. –

1

Ne peut pas vous attacher un débogueur et entrez dans le code? Il ne semble pas que vous ayez beaucoup d'itérations à parcourir pour voir la réponse. (Si Visual Studio vous pouvez définir un point de rupture de données sur le comptage à l'exécution, j'imagine que GDB et la plupart des autres débogueurs le supporteront.)

0

Peut-être votre instruction if juste après la boucle while est-elle fausse? L'autre attaché à cela contient une instruction count ++ dans une boucle.