Wie übergebe ich einen Filestream

sisela

Erfahrenes Mitglied
Hallo,
habe leider nichts zu diesem Thema gefunden. Sorry falls es das schon gibt.
Ich habe ein kleines Problem. Ich durchsuche rekursiv alle Verzeichnisse einer bestimmten Platte nach bestimmten Dateien z. B. *.mp3.
Zur Zeit gebe ich die Suchergebnisse auf dem Bildschirm aus. Nun möchte ich aber die gefundenen Dateien in eine Datei speichern.
Da ich aber meine Suchfunktion rekursiv aufrufe, wird der fstream immer neu angelegt und meine Datei wieder gelöscht. So dass immer nur ein Suchergebnis in der Datei steht. Das ist aber doof ;-((

Erstelle ich vor Funktionsaufruf ein fstream Objekt ist dieses in der Funktion nicht mehr bekannt. Und erstelle ich es in der Funktion passiert das oben geschilderte.
Hier mal der Quellcode:
Code:
void CFile::search() {
	char savepath[MAX_PATH];	// zur Zwischenspeicherung des Pfades
	int len;
		
	cout << ".";
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind;
	strcpy(savepath, path);		// Sicherung des Pfades
	strcat(path, "\\*");
	hFind = FindFirstFile(path, &FindFileData);
	if(hFind == INVALID_HANDLE_VALUE) {
		cout << "Datei nicht vorhanden oder anderer Fehler..." << endl << "GetLastError: " << GetLastError () << endl;
	} 
	else {
		do {
			int result = strcmp(FindFileData.cFileName, "."); 
			int result2 = strcmp(FindFileData.cFileName, ".."); 
			if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && result != 0 && result2 !=0) {
				len=strlen(path);
				strcpy(&path[len-2], "\0");
				strcat(path, FindFileData.cFileName);
				strcat(path, "\\");
				search();
				strcpy(path, savepath);
				strcat(path, "\\*");
			}
			else {
								
				char file_end[MAX_PATH];
				strcpy(file_end,FindFileData.cFileName);
				len=strlen(file_end);
				strcpy(&file_end[len-4], "\0");
				strcat(file_end, type);
				if((strcmp(file_end, FindFileData.cFileName)) == 0) {
				
//Problemanfang
					fstream FS("files.dat", ios::out  | ios::trunc);
					FS.close();
					FS.open("files.dat", ios::in | ios::out);
															
					FS << savepath; 
					FS << FindFileData.cFileName;
					FS << endl;				
//Problemende	

					cout << savepath << FindFileData.cFileName << endl;
					z++;
				}
			}

		} while(FindNextFile(hFind, &FindFileData));

	}
	FindClose(hFind);
}// end search

Diese Funktion wird von der main app aufgerufen und ruft wie ihr seht sich immer selber wieder auf.

Vielleicht könnte man das fstream Objekt schon in der main() anlegen und dann den fstream irgendwie übergeben. Weiss aber nicht wie...

So ihr freaks, jetzt seit ihr drann und ich bedank mich schonmal...
 
Natürlich musst Du Deiner Funktion einen Zeiger bzw eine Referenz auf deine ifstream - Instanz übergeben!
Code:
void CFile::search(fstream& FS){
....
FS << Ergebnis1 << Ergebnis2 << endl;
....
in der Main-Funktion muss das so aussehen
Code:
...
	fstream FS("files.dat", ios::out  | ios::trunc);
	FS.open("files.dat", ios::in | ios::out);
														
 	search(FS);
...
Damit hast Du nun einen einzigen Filestream für dein Hauptprogramm und kannst nach dem Aufruf von search die Datei weiter bearbeiten.

PS: Im C++ Buch nach Referenz-Operator suchen und gründlich durchlesen!
 
Hi,
vielen Dank erst einmal! Genau so habe ich mir das ungefähr vorgestellt. Ich habe es mal eben probiert, doch nun steht gar nichts mehr in der Datei.

In der Headerdatei (Class Deklaration) habe ich folgendes geändert:

Code:
	void search(fstream& FS);

In der Applikation (also der Aufruf) folgendes

Code:
	fstream FS("files.dat", ios::out  | ios::trunc);
	FS.open("files.dat", ios::in | ios::out);
	File.search(FS);
	FS.close();

und in der Class Definition (Funktion) folgendes:

Code:
FS << savepath << FindFileData.cFileName << endl;

Eigentlich alles recht logisch. Zuerst hatte der Compiler Probleme mit cout und fstream, als ich dann "using namespace std;" herausgenommen habe, compilierte er aber. Leider steht nichts in der Datei: file.dat

Zitat: Ein geistreicher Mensch wäre oft in Verlegenheit, ohne die Anwesenheit der Dummköpfe.
 
Fehler gefunden...

Code:
fstream FS("files.dat", ios::out  | ios::trunc);
// da hab ich doch vergessen, wieder zu schliessen
FS.close();
// Zeile eingefügt und schon gehts
FS.open("files.dat", ios::in | ios::out);
File.search(FS);
FS.close();

Vielen Dank nochmal an Thomas Kuse

Am Abend wird man klug für den vergangenen Tag, doch niemals klug für den der kommen mag.
 
Zurück