Programm reagiert nicht auf _findnext

Dominik Habersack

Grünschnabel

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.

Code:
// 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];

    struct _finddata_t fileinfo;
    long logfile1;
    int finderror = 0;

    logfile1 = _findfirst( "*.log*", &fileinfo );
    while ( finderror == 0 )
    {
            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";
            finderror = _findnext( logfile1, &fileinfo );
    }
    (void)_findclose( logfile1 );
    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++.
 

Anhänge

  • Logfile_Converter.zip
    1,7 KB · Aufrufe: 12
Zuletzt bearbeitet:
Okay, das Problem hat sich erledigt. Ich habe versucht, einem Array von 13 Zeichen weitere hinzuzufügen:
Code:
char saveto[13] = "Converted\\";
strcat( saveto, name2 );
Irgendwie logisch, dass das nicht funktionieren kann. Der Fehler lag also nicht bei _findnext, sondern war wesentlich simpler. Das wird mir auch so schnell nicht mehr passieren.

Mein Programm läuft mittlerweile einwandfrei.
 
Zurück