Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void CLogfile::CreateLogfile (const char *LogName) { // Logfile leeren und Kopf schreiben fopen_s(&m_Logfile, LogName, "w"); //ÄNDERUNG Textout ("<html><head><title>Logfile</title></head>"); Textout ("<body><font face='courier new'>"); WriteTopic ("Logfile", 3); ... // Logfile schließen und mit append wieder öffnen fclose (m_Logfile); fopen_s(&m_Logfile, LogName, "a"); //ÄNDERUNG } // CreateLogfile |
C-/C++-Quelltext |
|
1 2 3 |
m_Logfile = fopen (LogName, "w"); ... m_Logfile = fopen (LogName, "a"); |
C-/C++-Quelltext |
|
1 |
TCHAR buffer[MAX_BUFFER]; |
C-/C++-Quelltext |
|
1 |
char *buffer = new char[MAX_BUFFER]; |
C-/C++-Quelltext |
|
1 |
vsprintf (buffer, Text, pArgList); |
C-/C++-Quelltext |
|
1 |
vsprintf_s(buffer,MAX_BUFFER, Text, pArgList); |
C-/C++-Quelltext |
|
1 2 3 4 |
#include <windows.h> #include <stdio.h> #include <Singleton.hpp> ... |
C-/C++-Quelltext |
|
1 2 3 4 |
#include <windows.h> #include <stdio.h> #include "Singleton.hpp" ... |
C-/C++-Quelltext |
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#ifndef __Clogfile #define __Clogfile // Includes // #include <windows.h> #include <stdio.h> #include "Singleton.hpp" // Defines #define MAX_BUFFER 4096 // Maximale Größe für den Buffer #define L_FAIL false // Funktion war erfolgreich #define L_OK true // Funktion ist fehlgeschlagen #define Log_File Clogfile::Get () // Makro zur einfachen Verwendung // Farben für den Text enum FONTCOLORS { BLACK, RED, GREEN, BLUE, PURPLE }; // Klassendeklaration // class Clogfile : public TSingleton<Clogfile> { // Memberfunktionen public: Clogfile (); ~Clogfile (); void CreateLogfile (const char *LogName); void WriteTopic (const char *Topic, int Size); void Textout (const char *Text); void Textout (int Color, const char *Text); void Textout (int Color, bool List, const char *Text); void TextoutF (const char *Text, ...); void TextoutF (int Color, const char *Text, ...); void TextoutF (int Color, bool List, const char *Text, ...); void FunctionResult (const char *Name, bool Result); // Membervariablen private: FILE *m_logfile; }; #endif |
C-/C++-Quelltext |
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
#include "logfile.hpp" // Konstruktor // Aufgabe: Bisher noch keine Clogfile::Clogfile () { } // Destruktor // Aufgabe: Gibt Ende-Meldung aus und schließ das Logfile Clogfile::~Clogfile () { // logfile-Ende schreiben und Datei schließen Textout ("<br><br>===End of logfile===</font></body></html>"); fclose (m_logfile); } // Createlogfile // Aufgabe: logfile erstellen und Kopf schreiben void Clogfile::CreateLogfile (const char *LogName) { // logfile leeren und Kopf schreiben fopen_s(&m_logfile, LogName, "w"); Textout ("<html><head><title>Logfile</title></head>"); Textout ("<body><font face='courier new'>"); WriteTopic ("Logfile", 3); // Aktuelle Build-Konfiguration ausgeben #ifdef _DEBUG Textout ("BUILD: DEBUG<br>"); #else Textout ("BUILD: RELEASE<br>"); #endif // Link für E-Mail-Adresse schreiben Textout ("<a href='mailto:Daniel.Mislovic@gmail.com?subject=Logfile'>"); Textout ("Send E-Mail to me</a><br><br>"); // logfile schließen und mit append wieder öffnen fclose (m_logfile); fopen_s(&m_logfile, LogName, "a"); } // WriteTopic // Aufgabe: Überschrift erzeugen void Clogfile::WriteTopic (const char *Topic, int Size) { // Überschrift schreiben und flushen Textout ("<table cellspacing='0' cellpadding='0' width='100%%' "); Textout ("bgcolor='#DFDFE5'>\n<tr>\n<td>\n<font face='arial' "); TextoutF ("size='+%i'>\n", Size); Textout (Topic); Textout ("</font>\n</td>\n</tr>\n</table>\n<br>"); fflush (m_logfile); } // Textout // Aufgabe: Text ins logfile schreiben (schwarz) void Clogfile::Textout (const char *Text) { // Text schreiben und flushen fprintf (m_logfile, Text); fflush (m_logfile); } // Textout // Aufgabe: Text ins logfile schreiben (farbig) void Clogfile::Textout (int Color, const char *Text) { Textout (Color, false, Text); } // Textout // Aufgabe: Text ins logfile schreiben (farbig, Liste) void Clogfile::Textout (int Color, bool List, const char *Text) { //Listen-Tag schreiben if (List == true) Textout ("<li>"); // Farbtag schreiben switch (Color) { case BLACK: Textout ("<font color=black>"); break; case RED: Textout ("<font color=red>"); break; case GREEN: Textout ("<font color=green>"); break; case BLUE: Textout ("<font color=blue>"); break; case PURPLE: Textout ("<font color=purple>"); break; }; // Text schreiben Textout (Text); Textout ("</font>"); if (List == false) Textout ("<br>"); else Textout ("</li>"); } // TextoutF // Aufgabe: formatierten Text ins logfile schreiben (schwarz) void Clogfile::TextoutF (const char *Text, ...) { char *buffer = new char[MAX_BUFFER]; // char-Buffer va_list pArgList; // Liste der übergebenen Argumente // String aus den Argumenten erstellen va_start (pArgList, Text); vsprintf_s(buffer,MAX_BUFFER, Text, pArgList); va_end (pArgList); // Erzeugten String schreiben Textout (buffer); } // TextoutF // Aufgabe: formatierten Text ins Logfile schreiben (farbig) void Clogfile::TextoutF (int Color, const char *Text, ...) { char *buffer = new char[MAX_BUFFER]; // char-Buffer va_list pArgList; // Liste der übergebenen Argumente // String aus den Argumenten erstellen va_start (pArgList, Text); vsprintf_s(buffer,MAX_BUFFER, Text, pArgList); va_end (pArgList); // Erzeugten String schreiben Textout (Color, buffer); } // TextoutF // Aufgabe: formatierten Text ins logfile schreiben (farbig, Liste) void Clogfile::TextoutF (int Color, bool List,const char *Text, ...) { char *buffer = new char[MAX_BUFFER]; // char-Buffer va_list pArgList; // Liste der übergebenen Argumente // String aus den Argumenten erstellen va_start (pArgList, Text); vsprintf_s(buffer,MAX_BUFFER, Text, pArgList); va_end (pArgList); // Erzeugten String schreiben Textout (Color, List, buffer); } // FunctionResult // Aufgabe: OK oder ERROR für Funktionsaufruf ausgeben void Clogfile::FunctionResult (const char *Name, bool Result) { if (L_OK == Result) { Textout("<table width='100%%' cellSpacing='1' cellPadding='5'"); Textout(" border='0' bgcolor='#C0C0C0'><tr><td bgcolor="); TextoutF("'#FFFFFF' width='35%%'>%s</TD>", Name); Textout("<td bgcolor='#FFFFFF' width='20%%'><font color ="); Textout("'green'>OK</FONT></TD><td bgcolor='#FFFFFF' "); Textout("width='35%%'>-/-</TD></tr></table>"); } else { Textout("<table width='100%%' cellSpacing='1' cellPadding='5'"); Textout(" border='0' bgcolor='#C0C0C0'><tr><td bgcolor="); TextoutF("'#FFFFFF' width='35%%'>%s</TD>", Name); Textout("<td bgcolor='#FFFFFF' width='20%%'><font color ="); Textout("'red'>ERROR</FONT></TD><td bgcolor='#FFFFFF' "); Textout("width='35%%'>-/-</TD></tr></table>"); } } |
C-/C++-Quelltext |
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
#ifndef TSINGLETON #define TSINGLETON template <class T> class TSingleton { protected: // Membervariablen static T *m_pSingleton; // Statisches Objekt public: // Memberfunktionen // Destruktor // virtual ~TSingleton () { } // Get // // Aufgabe: Wenn nötig, statisches Objekt erzeugen und // Zeiger darauf zurückgeben // inline static T* Get () { // Existiert schon eine Instanz? if (!m_pSingleton) m_pSingleton = new T; // Nein, dann neue Instanz erzeugen // Zeiger auf die Instanz zurückgeben return (m_pSingleton); } // Get // Statisches Objekt freigeben // static void Del () { // Gab es eine Instanz? if (m_pSingleton) { delete (m_pSingleton); // Ja, dann freigeben m_pSingleton = NULL; // und Zeiger auf NULL setzen } } // Del }; // Die statische Variable erzeugen // template <class T> T* TSingleton<T>::m_pSingleton = 0; #endif |
C-/C++-Quelltext |
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#include <iostream> #include "Logfile.hpp" using namespace std; // Hauptprogramm // int main () { cout << "Hello World" << endl; float Kontrolle = 123.001f; // Variable zum Testen int test = 5; //################################### //TEST FÜR LOGFILE //################################### // Neues Logfile erstellen Log_File->CreateLogfile ("Logfile.html"); // Überschrift erzeugen Log_File->WriteTopic ("Überschrift Größe 0", 0); Log_File->WriteTopic ("Überschrift Größe 1", 1); Log_File->WriteTopic ("Überschrift Größe 2", 2); Log_File->WriteTopic ("Überschrift Größe 3", 3); Log_File->WriteTopic ("Überschrift Größe 4", 4); // Unformatierten Text ausgeben // Für Absatz einfach <br> in den Text hängen Log_File->Textout ("Unformatierter Text.<br>"); // Formatierter Text in Farbe, automatischer Absatz, reiner Text Log_File->Textout (BLACK, "Schwarzer Text Blub"); Log_File->Textout (RED, "Roter Text Blub"); Log_File->Textout (BLUE, "Blauer Text Blub"); Log_File->Textout (GREEN, "Grüner Text Blub"); Log_File->Textout (PURPLE, "Purple Text Blub"); //Benutzung von Int Variablen, beachte Formatierungsspezifizierer %i Log_File->TextoutF ("Kontrollvariable:i %i", test); Log_File->Textout("<br>"); /*Liste ausgeben von Int Variablen HIER FEHLER, DESHALB AUSKOMMENTIERT Log_File->TextoutF("Inhalt von test lautet: i%", test); Log_File->TextoutF(RED, true, "Inhalt von test lautet: i%", test); Log_File->TextoutF(BLUE, true, "Inhalt von test lautet: i%", test); Log_File->TextoutF(GREEN, true, "Inhalt von test lautet: i%", test); Log_File->TextoutF(PURPLE, true, "Inhalt von test lautet: i%", test); */ // Liste ausgeben, Benutzung von Float Variablen Log_File->TextoutF (BLACK, true, "Liste Kontrolle: %f", Kontrolle); Log_File->TextoutF (BLACK, true, "Liste Kontrolle: %f", Kontrolle*2.0f); Log_File->TextoutF (BLACK, true, "Liste Kontrolle: %f", Kontrolle*4.0f); // Erfolgreiche und Fehlgeschlagene Funktionen Log_File->FunctionResult ("Funktion_Eins", L_OK); Log_File->FunctionResult ("Funktion_Zwei", L_OK); Log_File->FunctionResult ("Funktion_Header_Laden", L_OK); Log_File->FunctionResult ("Funktion_Level_ASD_Laden", L_FAIL); Log_File->FunctionResult ("Funktion_Sound_Laden", L_OK); Log_File->FunctionResult ("Funktion_Drei", L_OK); Log_File->FunctionResult ("Funktion_Vier", L_FAIL); Log_File->FunctionResult ("Funktion_Fünf", L_OK); Log_File->FunctionResult ("Funktion_Sechs", L_OK); Log_File->FunctionResult ("Funktion_Sieben", L_FAIL); // Logfile schließen Log_File->Del (); return 0; } |
C-/C++-Quelltext |
|
1 2 3 |
// logfile schließen und mit append wieder öffnen fclose (m_logfile); fopen_s(&m_logfile, LogName, "a"); |
Zitat
o Wieso nutzt du nicht weiterhin die (konformen) Methoden fopen, vsprintf?
Zitat
o Wieso hältst du dich nicht an die "constcorrectness"?
Zitat
o Wieso verwendest du nicht den Debugger um zu sehen wo die etwas behauptet wird was nicht stimmt?
Zitat von »"Co1m"«
wow... ich versuche jetzt mal nicht beleidigt zu sein... :cry:
Also, ich bin Noop. Ich habe mich mit dem Buch C++ für Spieleprogrammierer bis Kapitel 8 Durchgekämpft, was soweit auch ganz gut funktioniert hat.
Die 3 Files Logfile.cpp Logfile.hpp Singleton.hpp sind aus dem Buch von Heiko Kalista.
Zitat von »"Co1m"«
Zitat
o Wieso nutzt du nicht weiterhin die (konformen) Methoden fopen, vsprintf?
Weil ich dann einige Warnings bekomme das diese Veraltet sind. Ich wollte ein sauberes File. Mit Hilfe von "kaid" habe ich bzw. er diese so umgeschrieben (wie oben im Zweiten Post beschrieben) damit die Warnings nicht mehr kommen.
C-/C++-Quelltext |
|
1 |
#define _CRT_SECURE_NO_DEPRECATE 1
|
Zitat von »"Co1m"«
Zitat
o Wieso hältst du dich nicht an die "constcorrectness"?
Weil ich nicht weiß was das bedeutet?! Wie gesagt C++ Beginner...
Zitat von »"Co1m"«
Auf die restlichen Fragen kann ich nur so Antworten das ich dieses Logfile so übernommen habe und es nur Fehlerfrei bügeln wollte. Ich selbst habe zu wenig erfahrung um dir zu sagen warum Heiko Kalista es so gemacht hat.
Deshalb ja dieser Thread.
Zitat von »"Co1m"«
Zitat
o Wieso verwendest du nicht den Debugger um zu sehen wo die etwas behauptet wird was nicht stimmt?
Debugger kommt erst in Kapitel 8.8 dran :-D, Logfile ist 8.6
Habe es versucht, aber auch hier fehlt mir das wissen.
Zitat von »"Co1m"«
Vielleicht sollte ich doch bei Java bleiben, was?
C-/C++-Quelltext |
|
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 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#include <cstdio> #include <cassert> #include <cstdarg> class LogFile { public: LogFile() : handle( 0 ) {} explicit LogFile( const char* fileName ) : handle( 0 ) { Open( fileName ); } ~LogFile() { Close(); } bool Open( const char* fileName ) { Close(); handle = fopen( fileName, "w" ); if ( handle ) { // do not buffer any data setvbuf( handle, 0, _IONBF, 0 ); // write some headerinfos Write( "Created on [...]\n" ); } return ( handle != 0 ); } void Close() { if ( handle ) { fclose( handle ); handle = 0; } } void Write( const char* text, ... ) { assert( handle ); char buffer[ 2048 ]; va_list argptr; va_start( argptr, text ); vsprintf( buffer, text, argptr ); va_end( argptr ); fprintf( handle, buffer ); } private: FILE* handle; }; |
Zitat
A_START.cpp:
C-/C++-Quelltext
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <iostream> #include "Logfile.hpp" using namespace std; // Hauptprogramm // int main () { [...] /*Liste ausgeben von Int Variablen HIER FEHLER, DESHALB AUSKOMMENTIERT Log_File->TextoutF("Inhalt von test lautet: i%", test); Log_File->TextoutF(RED, true, "Inhalt von test lautet: i%", test); Log_File->TextoutF(BLUE, true, "Inhalt von test lautet: i%", test); Log_File->TextoutF(GREEN, true, "Inhalt von test lautet: i%", test); Log_File->TextoutF(PURPLE, true, "Inhalt von test lautet: i%", test); */ [...] // Logfile schließen Log_File->Del (); return 0; }
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
[...] //Liste ausgeben von Int Variablen HIER FEHLER, DESHALB AUSKOMMENTIERT Log_File->TextoutF("Inhalt von test lautet: %i", test); Log_File->TextoutF(RED, true, "Inhalt von test lautet: %i", test); Log_File->TextoutF(BLUE, true, "Inhalt von test lautet: %i", test); Log_File->TextoutF(GREEN, true, "Inhalt von test lautet: %i", test); Log_File->TextoutF(PURPLE, true, "Inhalt von test lautet: %i", test); [...] |
Werbeanzeige