Zum Inhalt springen

[C++] Programm reagiert nicht auf _findnext


Empfohlene Beiträge

Geschrieben

Guten Morgen,

Ich bin zur Zeit dabei, mir wieder etwas C++ anzueignen, wobei ich auf folgendes Problem gestoßen bin:

Meine Aufgabe ist es, ein Programm zu schreiben, welches Logfiles einliest und sie komplett in Kleinbuchstaben konvertiert. Der Part mit der Groß- und Kleinschreibung ist kein Thema, das Öffnen und Speichern der Dateien schon eher.

Da es sich um ziemlich viele Logfiles handelt möchte ich natürlich nicht jedes Mal den Namen manuell eintippen müssen. Gesucht, gefunden: _findfirst und _findnext. Meine Schwierigkeit liegt dabei, dass ich keine Ahnung habe, wie diese Funktionen arbeiten. Zwar habe ich alle Beiträge in diesem und anderen Foren gelesen die es gibt, aber wirklich funktionieren möchte mein Code trotz aller Änderungen nicht.

Mittlerweile habe ich es geschafft, die beiden Funktionen in mein Programm einzuarbeiten, das erste Logfile wird auch prompt gefunden, konvertiert und an die entsprechende Position gespeichert. findfirst funktioniert also.

Irgendetwas an meinem Code weigert sich aber, den neuen von findnext zurückgegebenen Wert zu verarbeiten. Das Programm findet zwar die nächste Datei (denke ich jedenfalls), konvertiert diese aber nicht, sondern beendet sich einfach.

Da ich vermute, dass diese Blockade in meiner Konvertierungsschleife steckt, kopiere ich mal den gesamten Code. Die markierten Zeilen sind die, die mir ziemlich unklar sind, da ich den Teil mit findfirst und findnext dem Bloodshed-Forum auf Sourceforge entnommen habe.

// Logfile-Converter; Dominik Habersack


#include <iostream>

#include <fstream>

#include <windows.h>

#include <io.h>

using namespace std;


int main( int argc, char *argv[ ] )

{

    // name console-window, only cosmetic effect

    SetConsoleTitle( "Logfile-Converter" );


    // content holds a single line from source-file

    string content, adress, name;

    char name2[18];


    [COLOR=Red]struct _finddata_t fileinfo;

    long logfile1;

    int finderror = 0;


    logfile1 = _findfirst( "*.log*", &fileinfo );

    while ( finderror == 0 )[/COLOR]

    {

            name = fileinfo.name;

            // this adress-string is of NO USE, it is needed NOWHERE within the source-

            // code, however without this declaration converted files will be empty

            adress = "Logfiles\\" + name;


            cout << "Converting: " << name;


            // write filename from string to array

            for ( int i = 0; i <= name.length(); i++ )

            {

                name2[i] = name[i];

            }


            // open file

            ifstream logfile( fileinfo.name );


            // create a file in a second sub-directory, named exactly like original

            // makes sure there still is a backup in case of severe bug

            char saveto[13] = "Converted\\";

            strcat( saveto, name2 );

            ofstream output ( saveto, ios::ate );


            // execute loop if end of file has not been reached yet

            while ( !logfile.eof() )

            {

                // read a (new) line from the file

                getline( logfile, content );

                // check all characters (one at a time) inside this line

                for ( int i = 0; i <= content.length(); i++ )

                {

                    // check if current character is uppercase

                    if ( isupper( content[i] ) )

                    {

                        // if so: replace it with its lowercase-equivalent

                        content[i] = tolower( content[i] );

                    }

                    // add lowercase-letter, either changed or not

                    output << content[i];

                    // for output: enter new line if end of string is reached

                    if ( i == content.length() )

                    {

                        output << endl;

                    }

                }

            }

            cout << "\t\t\tdone";

            [COLOR=Red]finderror = _findnext( logfile1, &fileinfo );[/COLOR]

    }

    [COLOR=Red](void)_findclose( logfile1 );[/COLOR]

    cin.get();

}

Zusätzlich dazu habe ich den Quellcode und drei Test-Logfiles angehängt, falls euch die Funktionsweise des Programms unklar sein sollte.

Vermutlich übersehe ich nur eine banale Kleinigkeit, aber diese Kleinigkeit treibt mich langsam in den Wahnsinn. Ich sitze jetzt mittlerweile etwas mehr als 12 Stunden an einem Programm, das man, wenn man wirklich Ahnung von dem hätte was man macht, in weniger als einer halben Stunde schreiben könnte. Jeder noch so kleine Tipp wäre mir eine große Hilfe.

Mein Betriebssystem ist Windows XP, mein Compiler Dev-C++.

Logfile_Converter.zip

Geschrieben

Daran habe ich nicht gedacht, das ist richtig, vielen Dank für den Hinweis.

"Kleinere" Schönheitsfehler darf mein Programm auch noch haben, um die kümmere ich mich später, wesentlich wichtiger ist die _findnext-Geschichte.

Geschrieben
"Kleinere" Schönheitsfehler darf mein Programm auch noch haben, um die kümmere ich mich später, wesentlich wichtiger ist die _findnext-Geschichte.
Das sind beileibe keine Schönheitsfehler, sondern handfeste Bugs. saveto ist nämlich auch viel zu klein. Und das ist auch der Fehler. Du schreibst wild im Stack rum, indem du in saveto viel mehr reinschreibst als reinpasst. Damit überschreibst du dein ifstream-Objekt und alles fliegt dir um die Ohren.
Geschrieben
Das sind beileibe keine Schönheitsfehler, sondern handfeste Bugs. saveto ist nämlich auch viel zu klein. Und das ist auch der Fehler. Du schreibst wild im Stack rum, indem du in saveto viel mehr reinschreibst als reinpasst. Damit überschreibst du dein ifstream-Objekt und alles fliegt dir um die Ohren.
Geflogen ist da noch nichts. Aber trotzdem Danke für die Zurechtweisung, die ganze Materie ist leider (wieder) ziemlich neu für mich.

Meinen Fehler hatte ich mittlerweile auch schon selber gefunden und behoben, ich habe auch gemerkt, dass das ein größerer Fehler war. Ein genauerer Blick auf diese Zeile und ich habe es gesehen. Das Programm läuft einwandfrei.

Diesen Fehler werde ich ab sofort auch nicht mehr machen, diese Übung hat mich geprägt.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...