C++ Datei einlesen Abbruchbedingen über 2 Zeilen

Hallo.

Ich habe folgendes Problem... und zwar Lese ich eine Datei(.unv) Zeile für Zeile ein.

Ich lese z.B. aus dem Block 15 die Messwerte ein und möchte die do-while Schleife nun mit der Abbruchbedingungen, dass wenn -1 auftaucht und in der darauffolgenden Zeile 82, beenden.

Nun weiß ich aber nicht genau wie ich diese 2 Bedingungen verknüpfe.

Denn, wenn ich nur die -1 oder 82 als Abbruchbedingungen genommen habe, kann es sein dass diese Zahlen in meinen Messwerten vorkommen, und ich zu früh abbreche.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
char Eingabezeile[255];
char *charZgr = NULL;
char *SuchZgr = NULL;

do
{

	// Abbruchbedingung

	SuchZgr = strstr(Eingabezeile,"-1");

	if( SuchZgr != NULL ) 
	{ 
		if( fgets(Eingabezeile,255,FilePTR) == NULL ) 
			strcpy(Eingabezeile,"");
		break; 
	}
 
			
	// Block 15 wurde gefunden, in nächster Zeile Werte einlesen 
	fgets(Eingabezeile,255,FilePTR); 
	charZgr = Eingabezeile; 

//[...] mit Sscanf Werte einlesen sscanf(charZgr,"%f...",..."); ,irrelevant  
 
if( fgets(Eingabezeile,255,FilePTR) == NULL )  
		strcpy(Eingabezeile,"");

	if( charZgr != NULL ) 
	{
		break;
	}

} while( strlen(Eingabezeile) != 0 );

			



Wie könnte ich nun im für den SuchZgr die zweite Bedingung reinbringen, dass die darauffolgende Zeile "82" stehen muss, um abzubrechen. Ansonsten er weiter Werte einlesen soll.


Bsp der EinleseDatei:


1
2
3
4
5
6
7
8
9
10
  [...]
    -1                                                                          
    15                                                                          
       101         0         0         8   6.2000e+01   0.0000e+00   4.5000e+02
[...]
       202         0         0         2   7.4000e+01  -1.0000e+01  -6.8200e+01
    -1                                                                          
    -1                                                                          
    82                              


Danke!

Grüße
closed account (iAk3T05o)
Jeez. Google translate.
Es ist nicht leicht zu verstehen...

Ich weiß auch nicht genau, was die if-Anweisung in Zeile 12 zu bedeuten hat?

Um die Werte "-1" und und "82" zu verknüpfen, solltest du es so schreiben:
1
2
3
4
5
6
7
8
9
10
do
{

	// Abbruchbedingung
	if( SuchZgr != NULL )
	{
		if( strstr(Eingabezeile,"82")  != NULL )
				break;
	}
	SuchZgr = strstr(Eingabezeile,"-1");
Ich denke, dass die if-Anweisung in Zeile 12 entfernt werden sollte.
Also. mein Pointer SuchZgr zeigt solange auf NULL, bis er in der Eingabezeile die Zahl "-1" gefunden hat, damit wäre die if Bedingung( != NULL) erfüllt. Wenn dies der Fall ist, dann springt er aus der do-while Schleife raus.


darum bräuchte ich sowas wie "
1
2
3
4
if (strstr(Eingabezeile,"-1") && strstr(Eingabezeile+1, "82") ) 
{
...
}



... bloß wie ich für die 82 die nächste Zeile bekomme.. weiß ich nicht.

könnte ich

1
2
3
4

if (strstr(Eingabezeile,"-1") && strstr(fgets(Eingabezeile,255,FilePTR),"82"))
{
}


dafür nehmen. damit er die nächste Zeile auch überprüft?
Also. mein Pointer SuchZgr zeigt solange auf NULL, bis er in der Eingabezeile die Zahl "-1" gefunden hat, damit wäre die if Bedingung( != NULL) erfüllt. Wenn dies der Fall ist, dann springt er aus der do-while Schleife raus.
In meinem Beispiel springt er nur aus der Schleife, wenn die zuletzt gelesene Eingabezeile den Wert "82" enthält (und davor "-1"). Darum ging es doch, oder nicht?

Sollten keine Aktionen mehr ausgeführt werden nachdem fgets "82" liefert muss es so aussehen:
1
2
3
4
5
6
7
8
9
10
11
12
do
{
	fgets(Eingabezeile,255,FilePTR); 

	if( SuchZgr != NULL )
	{
		if( strstr(Eingabezeile,"82")  != NULL )
				break;
	}
	SuchZgr = strstr(Eingabezeile,"-1");

	charZgr = Eingabezeile; 


1
2
3
if (strstr(Eingabezeile,"-1") && strstr(fgets(Eingabezeile,255,FilePTR),"82")) // Schlecht
{
}
Sollte Eingabezeile nicht "82" enthalten, dann wird eine Zeile übersprungen.

Das ist immer die Gefahr, wenn zwei fgets() auftauchen
Last edited on
ok dankeschön, jetzt kann ich deine Lösung auch nachvollziehen!
mein Problem ist jetzt noch, dass die Abbruchbedingungen zwar alles nun klappt, aber er mit der -1 trotzdem erst noch weiterrechnet.

Werte
-1
-1
82


d.h.
er liest -1 ein, SuchZgr und charZgr haben den Wert -1, dann geht er in sscanf(charZgr,"%f ...", &value[0]); speichert mir da die -1 ab, was er nicht mehr soll.
Danach geht er in die nächste Zeile, die ist auch noch -1.. selbe Spiel.. speichert mit diese auch ab. Erst danach kommt die Zeile 82, sodass er in die Bedingung springt und abbricht.
Wie kann ich das abbspeichern der -1 durch sscanf verhindern, in den beiden Zeilen ?
Bei den Messwerten die -1 enthalten, soll es natürlich weiterhin bestehen bleiben


Danke
Last edited on
Es ist nicht schlimm, dass die -1 gemerkt wird. Das bedeutet nur, dass vor dem break; die zuviel gelesenen -1 wieder entfernt werden müssen.
mein Problem ist,


dass ich mit sscanf die werte in ein array speichere

und bestimmte werte aus dem array direkt an bestimmte Typen übergebe. das müsste aber verhindert werden.
und bestimmte werte aus dem array direkt an bestimmte Typen übergebe. das müsste aber verhindert werden.
Das einfachste wären zwei Schleifen:
1. Schleife: Werte in ein array/vector einlesen
2. Schleife: Verarbeiten der Werte

Ansonsten wird es schwierig (nicht umöglich): Du müsstest mit drei statt einer Zeile arbeiten. Prinzipell würde das so gehen:
Wenn die vierte Zeile gelesen wurde, wird die zweite zur ersten, die dritte zur zweiten und die vierte zur dritten. Wie eine queue
Topic archived. No new replies allowed.