[C/C++] Verzeichnisinhalt auslesen, usw.

Revontulet

Ensign
Registriert
Apr. 2004
Beiträge
233
Hallo,
ich habe folgendes Problem:
Ich möchte ein Verzeichnis mit mehreren tausend Messreihen automatisiert auswerten lassen.
Dazu habe ich mir folgendes zusammengebastelt (da der mit Abstand größste Teil hier irrelevant ist habe ich ihn weggelassen):
Code:
	DIR *dp;
	struct dirent *ep;

	ifstream messergebnisse;
	
	dp = opendir ("./");	
	if (dp != NULL)
	{
		while (ep = readdir (dp))
		{
			if(!strstr(ep->d_name,"."))
			{				
				if(strstr(ep->d_name,"Keil_oben-086Clicks_Hmax=500_deltaH=20"))
					messergebnisse.open(ep->d_name);
				if(messergebnisse)
				{
					printf("%s opened\n",ep->d_name);
					messergebnisse.close();
				}
			}
		}
		
		closedir (dp);
	}
	else	
		printf("Couldn't open the directory\n");
Das eigentliche Einlesen der Verzeichnisses klappt problemlos, wenn ich jedoch versuche, die Dateien anhand einiger Kriterien zu filtern, passiert Mist. Bei dem obigen Beispiel (das zugegebenermaßen etwas sinnfrei ist) sollte doch an sich nur die Datei Keil_oben-086Clicks_Hmax=500_deltaH=20 geöffnet werden, es passiert jedoch das folgende:
Code:
$ ./a.out
Entmag opened
Keil_oben-086Clicks_Hmax=500_deltaH=20 opened
Keil_oben-088Clicks_Hmax=250_deltaH=05 opened
Auffällig hierbei ist:
"Entmag" ist die erste Datei, die auf das Kritererium, dass sich im Dateinamen kein "." befindet, zutrifft. Dann folgt die gewünschte Datei, und Nummer drei ist die darauf folgende Datei.
Dieses Problem ist reproduzierbar unter Windows/cygwin mit dem gcc4.1.0 und unter Mandria (gcc 4.1.1).
Sieht jemand von euch da eine Möglichkeit, den Mist loszuwerden?
 
Zuletzt bearbeitet:
wie und wo hast du messergebnis definiert?
zum anderen: wenn die datei "Keil_oben-086Clicks_Hmax=500_deltaH=20" heißt und du den pfad kennst, kannst du doch auf den vergleich mittels strstr verzichten und einfach den kompletten pfad vergleichen, oder?
 
Ich habe beim Kürzen des Codes eine Zeile zuviel gelöscht, damit sollte die erste Frage erledigt sein ;)
Zu dem anderen Punkt:
Ich habe ja schon angedeutet, dass die Abfrage
Code:
if(strstr(ep->d_name,"Keil_oben-086Clicks_Hmax=500_deltaH=20"))
hier nicht die sinnvollste ist, sie sollte das Problem verdeutlichen. Konkret werden die Dateien nach verschiedenen Kriterien gefiltert, etwa nach dem ersten Wort, oder nach Hmax. Jedoch treten auch hier derartige Probleme auf (die erste Datei wird mit ausgegeben, eine Datei wird zuviel ausgegeben, wenn die Datei davor dem Suchkriterium entsprach, ...).
 
ah gut. also wenn du ein ifstream erstellst, ohne argumente anzugeben, so ist
if(irgendein_stream)
stets war. du musst ihn also nach dem erstellen erstmal schließen. das sollte den einen fehler beheben.
bei dem anderen fällt mir gerade nichts auf... das könnte aber mit dem ersten fehler zusammenhängen.
 
Das kommt tatsächlich dem gewünschten Ergebnis näher ;-)
Ich habe die Datei wie von dir vorgeschlagen direkt nach dem Erstellen geschlossen, und die erste Datei wird nicht mehr mit herausgesucht. Die Bedingung
Code:
if(messergebnisse)
durch
Code:
if(messergebnisse.good())
ersetzt (nach diesem Beispiel). Die dritte (jetzt zweite) Datei aus dem Beispiel aus dem ersten Post wird weiterhin, da sehe ich jetzt auch spontan keinen Fehler?
 
was du mal probieren könntest, da das erstellen von ifstreams ist nicht so sonderlich aufwendig ist:
Code:
        DIR *dp;
        struct dirent *ep;

        // ifstream messergebnisse;
        
        dp = opendir ("./");    
        if (dp != NULL)
        {
                while (ep = readdir (dp))
                {
                        if(!strstr(ep->d_name,"."))
                        {                               
                                if(strstr(ep->d_name,"Keil_oben-086Clicks_Hmax=500_deltaH=20"))
                                {
                                        ifstream messergebnisse(ep->d_name);
                                        if (messergebnisse)
                                       {
                                               printf("%s opened\n",ep->d_name);
                                               messergebnisse.close();
                                       }
                                }
                        }
                }
                
                closedir (dp);
        }
        else    
                printf("Couldn't open the directory\n");
ich weiß natürlich nicht, ob sich das sinnvoll in deinem code einbauen lässt. falls nicht, könntest du mal überlegen, ob du alles nach dem öffnen der datei nicht besser in eine unterfuntkion packst und diese dann mit dem ifstream als argument aufrufst.

EDIT nachtrag: das mit dem .good() ist egal. das führt nur die gleiche prüfung durch.
 
Danke für den Hinweis, das funktioniert perfekt ;) Ich hab an diese Möglichkeit gar nicht gedacht.
 
ghorst schrieb:
EDIT nachtrag: das mit dem .good() ist egal. das führt nur die gleiche prüfung durch.

Nope. Kleiner, aber feiner Unterschied.

operator void* (der bei if( ios_object) aufgerufen wird), prüft auf's fail- und error-bit, während good auf's eof-, fail- und error-bit schaut.
 
ok. stimmt du hast recht. allerdings spielt die überprüfung auf eof keine rollen, wenn man den "standard"-code zum auslesen, also
while(!stream.eof())
nutzt. da ist es nur eine überprüfung, die man zwei zeilen später noch einmal ausführt und folglich verschwendung von rechenzeit.

aber natürlich ist deine anmerkung richtig. ich hatte tatsächlich vergessen, dass es da einen unterschied gibt.
 
Zurück
Oben