C/C++ Programmierung: Ein einfaches Log-File erzeugen

Irren ist menschlich – und fehlerfreien komplexen Programmcode zu schreiben ist nahezu unmöglich. Um den Zeitaufwand für die Fehlersuche und -korrektur zu minimieren, müssen Programmierfehler möglichst frühzeitig gefunden werden. In diesem Zusammenhang stellen Log-Files ein unverzichtbares Hilfsmittel dar, da sich mit ihrer Hilfe der Programmablauf je nach Bedarf mehr oder weniger genau protokollieren und analysieren lässt. Eine umfassende Analyse ist insbesondere während der Entwicklungsphase und den Testzyklen notwendig. Nach dem Release ist normalerweise eine weniger umfangreiche Protokollierung ausreichend, sofern ein Großteil der Fehler (hoffentlich!) im Vorfeld gefunden und behoben worden sind.


// während des Testzyklus:
#define PROGRAM_TEST

...

#ifdef PROGRAM_TEST
  // zusätzlicher Log-File Eintrag
  // während des Testzyklus:
  Add_To_Log(...);
#endif


Erzeugt wird ein neues Log-File mithilfe der Begin_Log()-Funktion:

char NameOfLogFile[200];

inline
void Begin_Log(char* pNameOfLogFile char* pMessage)
{
    sprintf(NameOfLogFile, pNameOfLogFile);

    FILE* pfile;

    if((pfile = fopen(NameOfLogFile,"w")) != NULL)
    {
        fprintf(pfile,"%s\n", pMessage);
        fflush(pfile); // tastaturpuffer leeren
        fclose(pfile);
    }
}

Mithilfe der nachfolgenden Add_To_Log()-Funktionen können dem Log-File nun weitere Einträge hinzugefügt werden. Hierbei kann es sich um einfache Nachrichten handeln, bzw. um Nachrichten in Kombination mit unterschiedlichen Ausdrücken vom Typ char, float, long und BOOL. Hier einige Beispiele:

Protokollierung des Programmablaufs:

Add_To_Log("Initialisiere Objekt 1 ...");
...
Add_To_Log("Objekt 1 initialisiert");


Öffnen einer Datei:

Add_To_Log("Öffne Datei", "Test.txt");
...
Add_To_Log("Test.txt", "Datei nicht gefunden!");


Überprüfen eines numerischen Ausdrucks:

long NumSpaceShips;
...
Add_To_Log("Anzahl der Raumschiffe", &NumSpaceShips);


Hier die zugehörigen Funktionen im Detail:

inline void Add_To_Log(char* pMessage)
{
    FILE* pfile;

    if((pfile = fopen(NameOfLogFile,"a")) != NULL)
    {
        fprintf(pfile,"\n%s\n", pMessage);
        fflush(pfile);
        fclose(pfile);
    }
}

inline void Add_To_Log(char* pMessage, char* pProblem)
{
    FILE* pfile;

    if((pfile = fopen(NameOfLogFile,"a")) != NULL)
    {
        fprintf(pfile,"\n%s: %s\n", pMessage, pProblem);
        fflush(pfile);
        fclose(pfile);
    }
}

inline void Add_To_Log(char* pMessage, float* pValue)
{
    FILE* pfile;

    if((pfile = fopen(NameOfLogFile,"a")) != NULL)
    {
        fprintf(pfile,"\n%s: %f\n", pMessage, *pValue);
        fflush(pfile);
        fclose(pfile);
    }
}

inline void Add_To_Log(char* pMessage, long* pValue)
{
    FILE* pfile;

    if((pfile = fopen(NameOfLogFile,"a")) != NULL)
    {
        fprintf(pfile,"\n%s: %d\n", pMessage, *pValue);
        fflush(pfile);
        fclose(pfile);
    }
}

inline void Add_To_Log(char* pMessage, BOOL* pValue)
{
    FILE* pfile;

    if((pfile = fopen(NameOfLogFile,"a")) != NULL)
    {
        fprintf(pfile,"\n%s: %d\n", pMessage, *pValue);
        fflush(pfile);
        fclose(pfile);
    }
}


Interessante Artikel