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,809082Datenerfassung 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 SecN mm Sec
9,257926 -0,75157326 8,0893555
-36,881477 -0,93467087 8,0666504Datenerfassung XXXXXXXXXXXXXXXXXXXXXXXX Zeit: 8,2302246 Sec
N mm Sec
-36,881477 -0,93467087 8,0666504
9,257926 -0,75157326 8,0893555Datenerfassung 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