2017-08-08 3 views
1

Ich habe in anderen Beispielen gesucht, aber ich kann dieses eine Arbeit nicht machen. Ich habe eine Datei, die irgendwann seltsame Zeichen hat zum Beispiel: "Äèîpg" Ich möchte diese Zeile nicht speichern, weil es scheint, dass die Schleife mit getline dort aufhören wird (es speichert bis die Zeile mit dem Papierkorb). Wie könnte ich das bitte machen? Ich weiß, wenn dies passiert: "key = 0", die nächste Zeile hat diese Zeichen "Äèîpg".Wie überspringe ich die nächste Zeile, wenn Bedingung C++

Hier ist mein Code:

file = "example.log"; 
    ifstream f(file); 
    f.open(file); 
    if (f.good()){ 
     while (getline(f, line)) { 
      lineNumber++; 
      if ((lineNumber>= line1 - 20) && (lineNumber<= line2)){ 
       pos = line.find("key = 0"); 
       if (pos != string::npos){ 
        std::cout << "skip the line" << endl; 

       } 
       else{ 
        Type v; 
        v.line= line; 
        v.index = lineNumber; 
        linesVector.push_back(v); 
       } 
      } 
     } 
    } 
    f.close(); 

Dann erstelle ich einen Schnitt Datei mit der Info, die ich brauche:

ofstream myfile;  
    string merge = file + "_Cut.log"; 
    myfile.open(merge);  
    for (unsigned int i = 0; i < linesVector.size(); i++){  
     myfile << linesVector[i].line << "\n";  
     //std::cout << linesVector[i].line << endl;  
    } 
    myfile.close(); 

Danke im Voraus für Ihre Hilfe!

Um zu verdeutlichen, wie meine Datei aussieht, hier ist das Original "example.log" (ich kann es nicht irgendwo anhängen).

2017-08-03 09:38:46 Expeum im6 
2017-08-03 09:38:46 nubla4 
2017-08-03 09:38:46 blaze 
2017-08-03 09:38:46 ue 
2017-08-03 09:38:46 er 
2017-08-03 09:38:46 key = 0 
2017-08-03 09:38:46 Q2žl2pE&ö³„Ôï¬ÈL+g…^cÎ1áø/7E›¸¥ü‰úLÎ’Æ 
2017-08-03 09:38:46 81B9CEandrew499OEE4MUI5Q0VhbmRyZXc0OTk= 
2017-08-03 09:38:47 B9CEandrew499OEE4MUI5Q0VhbmRyZXc0OTk= 
2017-08-03 09:38:48 bla 
2017-08-03 09:38:49 OK 
2017-08-03 09:50:12 key = 0 
2017-08-03 09:50:12 E&ö³„Ôï¬ÈL+g…^cÎ1áø/7E›¸¥ü‰úLÎ’Æ 

und hier ist das, was ich in der geschnittenen Datei erhalten:

2017-08-03 09:38:46 Expeum im6 
2017-08-03 09:38:46 nubla4 
2017-08-03 09:38:46 blaze 
2017-08-03 09:38:46 ue 
2017-08-03 09:38:46 er 
2017-08-03 09:38:46 key = 0 
2017-08-03 09:38:46 Q2žl2p 

Das Problem ist, dass es in der letzten giberrish stecken und sich nicht bewegen kann! Könnte es sein, dass ein Wagenrücklauf fehlt? Mir gehen die Ideen aus.

+0

wert, einige Zeit mit den Debugger investieren genau herauszufinden, was mit „Äèîpg“ goofy ging . es könnte eine Mehrfachzeichencodierung sein und jedes dieser Zeichen könnte ein Ende der Dateimarkierung oder etwas enthalten, das den Strom aus dem einen oder anderen Grund in einen Fehlerzustand versetzt. – user4581301

+0

Hallo, es ist defacto, dass dies in meiner TXT-Datei passiert. Mein Versuch ist es, jede Zeile zu überspringen, die in der vorherigen Zeile mit der "key = 0" vorangestellt ist. – user6812514

+0

'if (lineNumber> = line1 - 20 && lineNumber <= 2)' ist viel einfacher zu lesen. Die zusätzlichen Klammern sind ablenkend. Es braucht Zeit, um herauszufinden, dass sie nichts bedeuten. –

Antwort

1

Es sieht also so aus, als ob Sie versuchen, die Zeile "key = 0" und die nächste Zeile wegzuwerfen?

Wenn ja, können Sie nur ignore in der verschachtelten if -Anweisung wie folgt verwenden: f.ignore(numeric_limits<std::streamsize>::max(), '\n')

Wenn lineNumber Sie eine Zeile betrachten Sie auch ++lineNumber hinzufügen müssen.

Wenn dies könnte die letzte Zeile in der Datei, die Sie diesen Code in insgesamt hinzufügen sollen:

if(!f.ignore(numeric_limits<std::streamsize>::max(), '\n')) { 
    break; 
} 
++lineNumber; 

Live Example

+0

vorhanden ist. Vielen Dank für Ihre Antwort. Ich fürchte, ich vermisse etwas hier. Meinst du sowas? wenn (Pos!= string :: npos) { \t \t \t \t \t std :: cout << "die Zeile überspringen" << endl; \t \t \t \t \t if (getline (f, line)) { \t \t \t \t \t \t ++ Zeilennummer; \t \t \t \t \t} \t \t \t \t \t else { \t \t \t \t \t \t break; \t \t \t \t \t} \t \t \t \t \t \t} Es ist nicht für mich arbeiten. Ich denke, dass die while (getline (f, line)) {schafft ein Problem. Könnten Sie bitte den Code, den Sie insgesamt meinen, posten? Ich drucke jetzt 0 Elemente. – user6812514

+0

danke, aber immer noch nicht funktioniert. Es zerbricht, nachdem es das zweite Mal diese Zeichen findet – user6812514

+1

Das ist wahrscheinlich ein anderer Fehler in Ihrem Code. Ihr Debugger sollte dabei helfen. – drescherjm

Verwandte Themen