Codeguard und Dateioperationen
-
Hallo,
nachdem ich durch die Suche keine Lösung für mein Problem gefunden habe (Threads habe ich aber gefunden) hier meine Frage:
Ich habe eine Klasse zum schreiben und lesen eines Log-Files. Der auf das wesentliche reduzierte Code:
Header:
#ifndef LogFileH #define LogFileH //#include <boost/filesystem/fstream.hpp> #include <string> //#include <fstream> #include <stdio.h> //namespace fs = boost::filesystem; class TLog { private: FILE *logfile; // fs::fstream logfile; public: __fastcall TLog(std::string const &filename); __fastcall ~TLog(); void Write(std::string const val); void Read(); }; #endifcpp-Datei
#include "LogFile.h" TLog *Log; // --------------------------------------------------------------------------- __fastcall TLog::TLog(std::string const &filename) { logfile = fopen(filename.c_str(),"a+"); // logfile.open(filename.c_str(), std::ios::out|std::ios::in|std::ios::app); return; } // --------------------------------------------------------------------------- __fastcall TLog::~TLog() { // logfile.close(); fclose(logfile); return; } // --------------------------------------------------------------------------- void TLog::Write(std::string const val) { // if(logfile.is_open()) { // logfile << val << std::endl; // } if(logfile != NULL) { fputs(val.c_str(),logfile); } return; } // --------------------------------------------------------------------------- void TLog::Read() { return; } // ---------------------------------------------------------------------------Aufruf im Konstructor einer Form:
TLog *MyLog; MyLog = new TLog("c:\\temp\\wk_log.txt"); ... ... ...in einer anderen Funktion der Form:
MyLog->Write("yyyy");im OnClose Event der Form:
delete MyLog; MyLog = NULL;Codeguard beschwert sich mit folgendem Fehler, egal ob ich mit der Standardlibrary, dem Boost-Filesystem oder direkt mit Filefunktionen arbeite
mit folgendem Fehler:Fehler 00001. 0x310000 (Thread 0x0C94):
Falscher Parameter: Falsches Datei- oder Pipe-Stream (0xB53C84) wurde an die
Funktion weitergegeben.
fputs(0x0013F1EC ["yyyy"], 0x00B53C84)Aufrufhierarchie:
0x004A9A22(=Walzenkartei.exe:0x01:0A8A22)
0x004988EC(=Walzenkartei.exe:0x01:0978EC)
0x502BECD7(=vcl140.bpl:0x01:0FDCD7)
0x00616D8F(=Walzenkartei.exe:0x01:215D8F)
0x50295E73(=vcl140.bpl:0x01:0D4E73)
0x5029A73D(=vcl140.bpl:0x01:0D973D)------------------------------------------
Fehler 00002. 0x310000 (Thread 0x0C94):
Falscher Parameter: Falsches Datei- oder Pipe-Stream (0xB53C3C) wurde an die
Funktion weitergegeben.
fflush(0x00B53C3C)Aufrufhierarchie:
0x00AD7DB3(=Walzenkartei.exe:0x01:6D6DB3)
0x00ADFBDE(=Walzenkartei.exe:0x01:6DEBDE)
0x00ADEE6C(=Walzenkartei.exe:0x01:6DDE6C)
0x00ADFDD8(=Walzenkartei.exe:0x01:6DEDD8)------------------------------------------
usw.In die Datei wird aber korrekt geschrieben.
In irgendeinem CodeGear-Artikel habe ich zwar gelesen, das man als Workaround
"Dynamic RTL" abschalten soll, aber auch nach dem Abschalten generiert Codeguard den gleichen Fehler.Ich hoffe, mir kann jemand helfen (vielleicht habe ich ja auch einen Fehler gemacht?).
Gruß Udo
-
Schau Dir doch mal den Zeiger auf TLog an. In Deiner Klasse TLog habe ich jetzt erst mal auch keinen Fehler gefunden.
BTW.: Gehört das nicht eher in das VCL-Forum?
mfg Martin
-
Hallo,
ich nutze zwar den C++Builder, aber das ist doch eher Builder-unabhänig?Was ist mit dem Zeiger auf TLog?
Gruß Udo
-
Udo11 schrieb:
Hallo,
ich nutze zwar den C++Builder, aber das ist doch eher Builder-unabhänig?CodeGuard ist kein Standardtool sondern nur bei den C(++) Compilern von Borland dabei.
Udo11 schrieb:
Was ist mit dem Zeiger auf TLog?
Keine Ahnung, Du hast ja nicht den Quelltext Deiner "TForm-Klasse" geliefert.
mfg Martin
-
Wenn das nicht hierher paßt, dann bitte ins richtige Forum verschieben.
Gruß Udo
-
Was passiert, wenn du den Parametertypen der Write() Funktion auf const std::string& änderst?
-
Gleiche Fehlermeldung von CodeGuard.
Gruß Udo
-
Udo11 schrieb:
Gleiche Fehlermeldung von CodeGuard.
Gruß Udo
Ist dir eigentlich aufgefallen, daß CodeGuard in beiden Fällen unterschiedliche Pointer anmeckert:
Falscher Parameter: Falsches Datei- oder Pipe-Stream (0xB53C84) wurde an die Funktion weitergegeben.
Falscher Parameter: Falsches Datei- oder Pipe-Stream (0xB53C3C) wurde an die Funktion weitergegeben.
mfg Martin
-
Ja, das ist mir aufgefallen, es gibt aber noch einen Unterschied:
Fehler 00001. 0x310000 (Thread 0x0C94):
Falscher Parameter: Falsches Datei- oder Pipe-Stream (0xB53C84) wurde an die
Funktion weitergegeben.
fputs(0x0013F1EC ["yyyy"], 0x00B53C84)Vielleicht ist der von Bedeutung?
Gruß Udo
-
Da ist kein Unterschied, das ist die gleiche Zahl.
Dass sich logfile verändert, würde mir dagegen schon eher verdächtig vorkommen. Lass dir mal den Wert von logfile direkt nach der Instanziierung von MyLog ausgeben und danach immer wieder. Wenn der Wert gleich bleibt, CodeGuard aber trotzdem meckert, liegt der Fehler bei CodeGuard.
-
Hallo,
da die Variable mylogfile private ist, habe ich die Funktion zur Ausgabe des Wertes in di Klasse aufgenommen:
im Header:int GetMyLogFile() const;Implementation:
int TLog::GetMyLogFile() const { return (int)&mylogfile; }Der Wert der Ausgabe ändert sich während der Programmlaufzeit nicht.
Gruß Udo
-
Udo11 schrieb:
Hallo,
da die Variable mylogfile private ist, habe ich die Funktion zur Ausgabe des Wertes in di Klasse aufgenommen:
im Header:int GetMyLogFile() const;Implementation:
int TLog::GetMyLogFile() const { return (int)&mylogfile; }Der Wert der Ausgabe ändert sich während der Programmlaufzeit nicht.
Gruß Udo
Ich würde mal auch nicht die Adresse deines Pointers untersuchen sondern den Inhalt.
mfg Martin
-
Hallo,
ich habe jetzt herausgefunden, das der CodeGuard-Fehler mit dem übergebenen String in der Funktion write(std::string) zusammenhängt.
Bei folgendem Funktionsaufruf wird der Fehler gemeldet:
MyLog->Write("ein Beispielstring");folgender Funktionsaufruf läuft ohne Fehler:
MyLog->Write(AnsiString("ein Beispielstring").c_str());Im zweiten Fall wird ja ein char* übergeben und im ersten Fall ein wchar_t* oder?
Wenn das jetzt doch eher VCL-Sache ist, dann bitte ins richtige Forum verschieben.
Gruß Udo