[c++] fstream-Handle übergeben

ktm_frans

Grünschnabel
Hallo zusammen,

ich bin noch ein absoluter Neuling im Bereich C++, drum brauch ich Hilfe zum Thema fstream.
Ich arbeite mit MS Windows und VS C++ 6.0.
Habe von einem Kollegen ein Projekt bekommen mit dem man Sachen in einem Trace speichert, das Ganze ist eine Dll. Meine Aufgabe ist es nun, Anstelle des Trace die Sachen in LogFiles zu schreiben. Da ich auf mehreren Kanälen aufzeichnen muss, brauche ich auch mehrere LogFiles. Nun das Problem:
Ich rufe unterschiedliche Funktionen auf die in das LogFile schreiben sollen,
wie kann ich das FileHandle übergeben. Habe mir eine Klasse geschrieben, die sieht so aus:
Code:
class fileHandle {
	
 public:
   fstream logFile;
   long openLogFile(short index, const char *sLogFileName);
   long closeLogFile(fstream& logFile);
   void writeLogFile(fstream& logFile);
};
die Funktionsimplementierung so:
Code:
long fileHandle::openLogFile(short index, const char *sLogFileName)
{

	fstream logFile(sLogFileName, ios::out | ios::trunc);

	logFile.close();

	// Neues File oeffnen zum Schreiben
	logFile.open(sLogFileName, ios::out);

	// Wenn nicht geoeffnet
	if(!logFile)
	{
	 printf("Datei konnte nicht geoeffnet werden%s\n\n" ,sLogFileName);
                 return NOK;
	}
                logFile << "TESTAUSGABE" << endl;
	return OK;
}

void fileHandle::writeLogFile(fstream& logFile)
{
	// Testausgabe
	printf("...Debug0 writeLogFile. \n\n");

	logFile << "Test aus writeLogFile" << endl;
}

und öffnen tue ich das Ganze so:
Code:
DLLEXPORT long configureLogFile(short index, const char *sLogFileName)
{
  //...
  fileHandle newFile;

  newFile.openLogFile(index, sLogFileName);

  //...
  return OK;
}

Soweit ist das klar.
Nur wie kann ich jetzt in einer anderen Funktion dieses LogFile wieder verwenden?
Kann ja eigentlich nicht so schwer sein Nur ich seh es einfach nicht...

Hoffe ich habe nicht vergessen und es ist einigermaßen verständlich was ich vor habe!?
Danke für die Hilfe
 
Hallo zusammen,

ich bin noch ein absoluter Neuling im Bereich C++, drum brauch ich Hilfe zum Thema fstream.
Ich arbeite mit MS Windows und VS C++ 6.0.
Habe von einem Kollegen ein Projekt bekommen mit dem man Sachen in einem Trace speichert, das Ganze ist eine Dll. Meine Aufgabe ist es nun, Anstelle des Trace die Sachen in LogFiles zu schreiben. Da ich auf mehreren Kanälen aufzeichnen muss, brauche ich auch mehrere LogFiles. Nun das Problem:
Ich rufe unterschiedliche Funktionen auf die in das LogFile schreiben sollen,
wie kann ich das FileHandle übergeben. Habe mir eine Klasse geschrieben, die sieht so aus:
Code:
class fileHandle {
	
 public:
   fstream logFile;
   long openLogFile(short index, const char *sLogFileName);
   long closeLogFile(fstream& logFile);
   void writeLogFile(fstream& logFile);
};
die Funktionsimplementierung so:
Code:
long fileHandle::openLogFile(short index, const char *sLogFileName)
{

	fstream logFile(sLogFileName, ios::out | ios::trunc);
Du legst hier eine neue, lokale (automatische) Variable an, die automatisch vernichtet wird (die Datei wird geschlossen) wenn die Funktion bzw. der Konstruktor verlassen wird. Du willst aber auf die Membervariable zugreifen:
C++:
this->logFile.open(..)
Warum öffnest du die Datei eigentlich 2-mal? Es reicht doch wenn du die Datei einmal öffnest.
und öffnen tue ich das Ganze so:
Code:
DLLEXPORT long configureLogFile(short index, const char *sLogFileName)
{
  //...
  fileHandle newFile;

  newFile.openLogFile(index, sLogFileName);
Hier hast du das gleiche Problem. Du definierst eine neue Variable, die aber nur in der Funktion verwendet werden kann. Du müßtest eine globale Instanz anlegen, oder mit Zeigern arbeiten.

Gruß
 
Danke erst einmal für Deine Antwort!

Eigentlich wollte ich mir beim ersten Öffnen das Handle erzeugen mit dem ich weiter arbeiten kann. Nur das funktioniert halt nicht so wie ich mir das gedacht habe, da es ja nur lokale Variablen sind
Das Problem ist, dass der Anwender die Pfade und Dateinamen der LogFiles (bis zu ca. 10 Stück) selber definiern muss, in Abhängigkeit zu den Kanälen die er zum Loggen geöffnet hat.
Ich muss nun das jeweilige File der schreibenden Funktion übergeben, wenn der Anwender die Funktion "startLogging" aufruft! Vondaher denke ich das dass nicht mit einer globalen Instanz funktioniert!
Die Idee mit den Zeigern hört sich ganz viel versprechend an, nur leider habe ich da noch keine Ahnung von
Hast Du da vielleicht mal ein kleines Beispiel?

Vielen Dank

Gruß
 
So, könnte das dann funktionieren:

C++:
DLLEXPORT fileHandle* configureLogFile(short index, const char *sLogFileName)
{
  //...
  fileHandle* fh = new fileHandle();

  if (newFile.openLogFile(index, sLogFileName) == OK) {
    return fh;
  } else return 0;
}

Beim Aufrufer:
C++:
fileHandle* fh;

if ((fh = configureLog(...)) != 0) {
  fh->writeLogFile(...);

  ... 

  delete fh;
} else {
  // logfile konnte nicht erstellt werden.
}
Gruß
 

Neue Beiträge

Zurück