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