Krokophil Geschrieben 30. September 2005 Geschrieben 30. September 2005 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 Zitieren
Klotzkopp Geschrieben 30. September 2005 Geschrieben 30. September 2005 name2 ist etwas knapp bemessen. Bedenke, dass da auch noch ein Nullterminierungszeichen rein muss. Zitieren
Krokophil Geschrieben 30. September 2005 Autor Geschrieben 30. September 2005 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. Zitieren
Klotzkopp Geschrieben 30. September 2005 Geschrieben 30. September 2005 "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. Zitieren
Krokophil Geschrieben 30. September 2005 Autor Geschrieben 30. September 2005 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. Zitieren
Empfohlene Beiträge
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.