Leerzeile erkennen



  • Hallo zusammen,

    ich sitze gerade an einem Programm, mit dessen Hilfe ich aus einer Datei (Ausschnitt)...

    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------

    Datenerfassung XXXXXXXXXXXXXXXXXXXXX Zeit: 7,032959

    N mm Sec
    26,301996 -13,61767 7,0126953
    -2,2475417 0,00352081 6,809082

    Datenerfassung XXXXXXXXXXXXXXXXXXXX Zeit: 7,0793457

    N mm Sec Ohne_Einheit
    **6,5432434 -0,058430299 6,8405762 1
    0,20859715 -0,66367805 6,8515625 1
    -0,49573934 -1,5142905 6,8625488 1
    2,3004897 -2,425364 6,8735352 1
    0,11211238 -3,3255391 6,8845215 1
    0,14688709 -4,2235641 6,8955078 1
    -0,32059762 -5,1106129 6,9064941 1
    0,24228093 -5,9787564 6,9174805 1
    2,613544 -6,8582783 6,9284668 1
    6,1086555 -7,7439303 6,9394531 1
    12,588943 -8,6173925 6,9504395 1
    19,685289 -9,504015 6,9614258 1
    21,729919 -10,389193 6,9724121 1
    23,023371 -11,273445 6,9833984 1
    24,877691 -12,157251 6,9943848 1
    17,48842 -13,035194 7,0053711 1
    25,173262 -13,919727 7,0163574 1
    23,127344 -14,656855 7,0273438 0
    25,800611 -14,84814 7,0383301 0
    28,984331 -14,90513 7,0493164 0
    29,271997 -14,934786 7,0603027 0
    29,532009 -14,942325 7,0712891 0
    **
    Datenerfassung XXXXXXXXXXXXXXXXXXXXXX Zeit: 8,1818848 Sec

    N mm Sec
    9,257926 -0,75157326 8,0893555
    -36,881477 -0,93467087 8,0666504

    Datenerfassung XXXXXXXXXXXXXXXXXXXXXXXX Zeit: 8,2302246 Sec

    N mm Sec
    -36,881477 -0,93467087 8,0666504
    9,257926 -0,75157326 8,0893555

    Datenerfassung XXXXXXXXXXXXXXXXXXXXXXX Zeit: 8,2321777 Sec

    N mm Sec Ohne_Einheit
    -1,1207591 -6,9654579 7,3022461 0
    -6,1380334 -6,9481297 7,3122559 0
    -5,9313874 -6,8883748 7,3222656 0
    .
    .
    .

    ------------------------------------------------------------------------------
    ------------------------------------------------------------------------------

    etc etc etc

    ... nur die Zahlenwerte (FETT) in der 4 Reihen auslesen kann.

    Folgenden Code habe ich zZ dafür:

    #include <fstream>  //brauche ichnicht alle.. Überbleibsel aus anderem Text
    #include <iostream>
    #include <string>
    #include <sstream>
    #include <cmath>
    #include <locale>
    
    using namespace std;
    
    double d1, d2, d3; 
    int i4;
    double x; 
    
    int main(int argc, char* argv[])
    {
        string strFileIn, strFileOut;
    
        if (argc < 3)
        {
    
    		cout << "Eingabedatei angeben: ";
            cin >> strFileIn;
            cout << endl;
    
    		cout << "Ausgabedatei angeben: ";
            cin >> strFileOut;
            cout << endl;
    
        }
        else
        {
            strFileIn = argv[1];
            strFileOut = argv[2];
        }
    
        ifstream in(strFileIn.c_str());          
        in.imbue( locale( "german" ) );
        if(!in) return -2;
    
        ofstream out(strFileOut.c_str());
        out.imbue( locale( "german" ) ); 
        if(!out) return -3;
    
    	out << "Kraft [N]\t\t" << "Weg [mm]\t\t" << "Zeit [s]\t\t" << "Betätigen/Entriegeln" << endl;
    
        for( string dummy; in >> dummy; )
    	{
    		if( dummy == "Ohne_Einheit" )
    // Hier frage ich bis String "Ohne_Einheit, da danach der relevante
    // Block losgeht
    		{	
    
    			in.ignore( 999, '\n' );
    
    			do
    			{
    
    				in >> d1 >> d2 >> d3 >> i4;
    				if( d1 == x) goto MARKER;
    // GOTO ist hier unschön, aber damit fängt er wenigstens nicht an endlos Müll
    // zu schreiben
    				out.precision(9);
    				out << d1 << "\t\t" << d2 << "\t\t" << d3 << "\t\t" << i4 << endl;
    				x = d1;
    
    			}
    			while( i4 == 1 || i4 == 0);
    
    // Der Integer Wert i4 ist immer entweder 0 oder 1
    // Diese Abfrage bringt nichts, da er mir immer wieder den letzetn Wert des
    // ersten Blocks endlos weiterschreibt!	
    
    		}
    
    	MARKER: ;	
    
    // den "goto"-MARKER habe ich auch am Schleifenanfang probiert aber er beendet 
    // dennoch immer das ganze Programm. Dafür passen die Werte bestens
    
        }
        return 0;
    }
    

    Ich habe versucht mein Problem zu komentieren.

    Kann mir jemand aushelfen, wie ich diese Leerzeile nach einem Block erkenne, sodass das ganze wieder mit der Schleife zur Abfrage nach "Ohne_Einheit" begoinnt?

    Vielen Dank im Voraus!

    TechM



  • Frag doch einfach den Stream-Status ab - wenn du auf die Zeile "Datenerfassung..." stößt, kann die Eingabe nicht mehr als Zahl interpretiert werden und der Eingabestream setzt sein failbit - das kannst du mit 'in.fail()' oder '!in.good()' (oder sogar '!in') abfragen und reagieren.

    PS: Eleganter als dein 'goto MARKER;' ist übrigens 'break;'.



  • Hallo,

    danke erstmal!

    Nein, mein größtes Problem ist, dass er nach dem ersten Block aufhört, also die erste

    for( string dummy; in >> dummy; )
    

    nicht bis zum Ende des files ausführt.
    Ich will aber die ganze Datei auswerten.

    btw, muss ich mit Problemen rechnen bei solchen txt dateien > 1 GB?

    Grüße

    TechM



  • Wie gesagt, nach der ersten unpassenden Eingabe (das ist, wenn die innerste Schleife zum "Datenerfassung..." kommt) ist das failbit des Streams gesetzt - danach weigert er sich erstens, noch irgendetwas einzulesen und erfüllt zweitens die Abbruchbedingung der for()-Schleife. Wenn du an dieser Stelle noch weitermachen willst, mußt due den Stream-Status erst per clear() zurücksetzen.



  • Hallo,

    danke CStoll, Problem behoben!

    Grüße


Anmelden zum Antworten