Du bist nicht angemeldet.

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

1

16.01.2019, 20:26

Listing_8.12/14 html Logfile erstellen

Hallo liebe Leute,

ich habe das Beispiel aus dem Buch 8.12 usw. abgetippt, um dieses html Logfile zu erstellen. Gestern habe ich alle Foren durchforstet, da ich folgende Meldung bekomme, wenn ich mit F5 kompiliere: "Ausnahme ausgelöst bei 0x76EBEB85 (ntdll.dll) in Logfile_class.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x01010125." Und zwar im Logfile.cpp bei

C-/C++-Quelltext

1
2
3
4
5
6
7
void CLogfile::Textout(const char *Text)
{
    //  Text schreiben unf flushen
    fprintf_s(m_Logfile, Text); <-- Ausgelöste Ausnahme
    fflush(m_Logfile);

} //    Textout (schwarz)


Wenn ich das ganze mit Strg - F5 kompiliere, wird das "debuggen" übersprungen, wie ich gelernt habe, dann kommt die Ausnahme nicht mehr und er erzeugt mir folgende HTML Datei mit dem Inhalt:

Quellcode

1
2
3
4
5
6
7
8
<html><head><title>Logfile</title></head><body><font face='courier new'><table cellspacing='0' cellpadding='0' width='100%' bgcolor='#DFDFE5'>
<tr>
<font face='arial' size='+9434700'>
Logfile</font>
</td>
</tr>
</table>
<br>BUILD: DEBUG<br><ahref='mailto:support@meineURL.de?subject=Logfile'>Send E-Mail to me</a><br><br>


Hier fehlt natürlich noch etwas, und zwar die Zeilen aus der int main()
Hat irgendjemand eine Idee woran das liegen kann? Warum fehlen die Zeilen aus der Logfile_class.cpp? Ich habe das Gefühl, ich sehe den Wald vor lauter Bäumen nicht mehr.

Ich verwende Visual Studio Version 15.9.5

hier noch mein restlicher Code:

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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
#include "pch.h"
#include "Logfile.hpp"

//  Konstruktor
//
//  Aufgabe: Bisher noch keine
//
CLogfile::CLogfile()
{

} //    Konstruktor

  //    Destruktor
  //    
  //    Aufgabe: Gibt Ende-Meldung aus und schließt das Logfile
  //
CLogfile::~CLogfile()
{
    //  Logfile - Ende schreiben und Datei schließen
    Textout("<br><br>End of logfile</font></body></html>");
    fclose(m_Logfile);

} //    Destruktor

  //    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 schrieben
    Textout("<ahref='mailto:support@meineURL.de?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");

} //    CreateLogfile

  //    WriteTopic
  //
  //    Aufgabe: Überschriff erzeugen
  //
void CLogfile::WriteTopic(const char *Topic, int Size)
{
    //  Überschrift schreiben un flushen
    Textout("<table cellspacing='0' cellpadding='0' width='100%%' ");
    Textout("bgcolor='#DFDFE5'>\n<tr>\n<font face='arial' ");
    fTextout("size='+%i'>\n", Size);
    Textout(Topic);
    Textout("</font>\n</td>\n</tr>\n</table>\n<br>");
    fflush(m_Logfile);

} //    WriteTopic

  //    Textout 
  //
  //    Aufgabe:Text in Logfile schreiben (schwarz)
  //
void CLogfile::Textout(const char *Text)
{
    //  Text schreiben unf flushen
    fprintf_s(m_Logfile, Text);
    fflush(m_Logfile);

} //    Textout (schwarz)

  //    Textout 
  //
  //    Aufgabe: Text ins Logfile schreiben (farbig)
  //
void CLogfile::Textout(int Color, const char *Text)
{
    Textout(Color, false, Text);

} //    Textout (farbig)

  //    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;
    };

    //  Texkt schreiben
    Textout(Text);
    Textout("</font>");

    if (List == false)
        Textout("<br>");
    else
        Textout("</li>");

} //    Textout (farbig, liste)

  //    fTextout
  //
  //    Aufgabe: formatierten Text ins Logfile schreiben (schwarz)
  //
void CLogfile::fTextout(const char*Text, ...)
{
    TCHAR buffer[MAX_BUFFER];
    va_list pArgList;
    va_start(pArgList, Text);
    sprintf_s(buffer, Text, pArgList);
    va_end(pArgList);
    Textout(buffer);
}

  //    fTextout
  //
  //    Aufgabe: Formatierten Text ins Logfile schreiben (farbig)
  //
void CLogfile::fTextout(int Color, const char*Text, ...)
{
    TCHAR buffer[MAX_BUFFER];
    va_list pArgList;
    va_start(pArgList, Text);
    sprintf_s(buffer, Text, pArgList);
    va_end(pArgList);
    Textout(Color, buffer);
}   

  //    fTextout
  //
  //    Aufgabe; formatierten Text ins Lofile schreiben (farbig, Liste)
  //
void CLogfile::fTextout(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 Argumeneten erstellen
    va_start(pArgList, Text);
    vsprintf_s(buffer, MAX_BUFFER, Text, pArgList);
    va_end(pArgList);

    //  Erzeugten String schreiben
    Textout(Color, List, buffer);

} //    fTextout (farbig, Liste)

  //    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=");
        fTextout("'#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=");
        fTextout("'#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>");
    }

} //    FunctionResult


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"

//  Define
#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 g_pLogfile CLogfile::Get()  //    Makro zur einfachen Verwndung

//  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 fTextout(const char *text, ...);
    void fTextout(int Color, const char *Text, ...);
    void fTextout(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
#include "pch.h"
//  C++ für Spielerprogrammierer
//  Listing 8.12
//  Anwendung der Logfile-Klasse
//
#include <iostream>
#include"Logfile.hpp"

using namespace std;

//  Hauptprogramm
//
int main()
{
    //  Variablen
    //
    float Kontrolle = 123.456f;  // Variable zum Testen

    //  Neues Logfile erstellen
    g_pLogfile->CreateLogfile("Logfile.html");

    //  Überschrift erzeugen
    g_pLogfile->WriteTopic("Unformatierter Text", 2);

    //  Unformatierten Text ausgeben
    g_pLogfile->Textout("Normaler, schwarzer Text<br>");
    g_pLogfile->Textout(RED, "Farbiger Text");
    g_pLogfile->Textout(BLUE, "Farbiger Text in Liste (1)");
    g_pLogfile->Textout(BLUE, "Farbiger Text in Liste (2)");
    g_pLogfile->Textout(BLUE, "Farbiger Text in Liste (3)");

    //  Überschrift erzeugen
    g_pLogfile->WriteTopic("Formatierter Text", 2);

    //  Formatierten Text ausgeben
    g_pLogfile->fTextout("Kontrollvariable: %f<br>", Kontrolle);
    g_pLogfile->fTextout(RED, "Kontrollvariable: %f", Kontrolle);
    g_pLogfile->fTextout(GREEN, true, "Liste Kontrolle: %f", Kontrolle);
    g_pLogfile->fTextout(GREEN, true, "Liste Kontrolle: %f", Kontrolle*2.0f);
    g_pLogfile->fTextout(GREEN, true, "Liste Kontrolle: %f", Kontrolle*4.0f);

    //  Eine erfolgreiche und eine fehlgeschlagene Funktion
    g_pLogfile->FunctionResult("Funktion_Eins", L_OK);
    g_pLogfile->FunctionResult("Funktion_Zwei", L_FAIL);

    //  Logfile schließen
    g_pLogfile->Del();

    return 0;
}


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
#ifndef TSINGLETON
#define TSINGLETON


template <class T>
class TSingleton {
protected:
    static T *m_pSingleton;
public:
    virtual ~TSingleton()
    {

    }
    inline static T* Get() {
        if (!m_pSingleton) {
            m_pSingleton = new T;
            return (m_pSingleton);
        }

    }
    static void Del() {
        if (m_pSingleton) {
            delete (m_pSingleton);
            m_pSingleton = NULL;
        }
    }
};
template <class T>
T* TSingleton<T>::m_pSingleton = 0;
#endif // !TSINGLETON


vielen dank und beste Grüße
totem