C++ Datei einlesen Abbruchbedingen über 2 Zeilen

Feb 18, 2014 at 9:36am
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
Feb 18, 2014 at 9:51am
closed account (iAk3T05o)
Jeez. Google translate.
Feb 18, 2014 at 10:08am
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.
Feb 18, 2014 at 11:41am
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.

Feb 18, 2014 at 11:44am
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?
Feb 18, 2014 at 12:14pm
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 Feb 18, 2014 at 12:15pm
Feb 18, 2014 at 2:47pm
ok dankeschön, jetzt kann ich deine Lösung auch nachvollziehen!
Feb 18, 2014 at 3:01pm
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 Feb 18, 2014 at 3:15pm
Feb 18, 2014 at 3:29pm
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.
Feb 18, 2014 at 3:59pm
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.
Feb 19, 2014 at 8:52am
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.