RoflCopter Geschrieben 28. August 2009 Teilen Geschrieben 28. August 2009 (bearbeitet) Hallo Community, nach mehr oder wenig kurzer Suche ( google ) bin ich auf einen Beitrag von diesem Forum gefunden, wie man einen String zu einem Integer umwandeln kann ( C++ ) Dies soll mit "istringstream" funktionieren, ich habe mir das Bsp. welches ich unter der Sufu gefunden habe bei Seite genommen und mal selber ausprobiert. Dennoch scheint mein Programm nicht zu funktionieren. Ich habe die Aufgabe ein Programm in C++ zu schreiben, welches aus einer .txt Datei komplette Zeilen einliest. Diese Zeile soll dann anhand der vorhandenen Trennzeichen ';' in Substrings gesplittet werden. Die 3 Substrings lauten: p = pfad dn = dateiname op = operator Anhand des Operators soll eine Aktion ausgeführt werden - Löschen oder Kopieren. Eventuelles Errorhandling steht noch nicht auf dem Plan. Das Problem ist, dass der gewünschte Effekt sprich: Datei kopiert oder Datei gelöscht nicht eintritt. Beispiel zum Inhalt der . txt Datei: D:\Test\;hallo_welt.txt\;2 Anbei der Quellcode #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <stdlib.h> #include <sstream> using namespace std; void fc_copyfile(string in, string out); void fc_append (); void fc_action(); void fc_com (); // global string p, dn, pad, gz, token; stringstream ss (token, istringstream::in | istringstream::out); int op; ofstream log; int main() { fc_com(); int i = 0; int a = 0; ifstream csv; log.open("Logfile.txt", ios::trunc, ios::binary); log << "Logfile created" << endl; csv.open("csv.txt", ios::binary); if(!csv) { log << "csv.txt not found." << endl; csv.close(); log.close(); exit (1); } while (!csv.eof()){ getline(csv, gz); i = 0; a = 0; int e = gz.find(";", a); while ( e > 0) { token = gz.substr(a, e-a); a = e + 1; e = gz.find(";", a); i++; switch(i) { case 1 : p = token; break; case 2 : dn = token; break; case 3 : ss << token; ss >> op; break; default: log << "Operator unknown!" << endl; } token = gz.substr(a); } fc_append(); fc_action(); } log << "Finished" << endl; csv.close(); log.close(); system("PAUSE"); return 0; } void fc_action () { // copy or delete switch (op) { case 1 : fc_copyfile(dn, pad); log << dn << " copied" << endl; case 2 : BOOL WINAPI DeleteFile( __in LPCTSTR pad); log << dn << " deleted" << endl; default : log << "Operator unknown!" << endl; } } void fc_copyfile(string in, string out) { // copy char by char ( binary mode ) ifstream inp; ofstream outp; char c; inp.open(in.c_str(), ios::binary); outp.open(out.c_str(), ios::binary); while(inp.get(c) && !inp.eof()){ outp.put(c); } } void fc_append () { // copy content of p to pad, append dn at pad ( p + dn ) pad = p; pad += dn; } void fc_com () { // text cout << "Copy and Delete" << endl; cout << "Read the Logfile.txt for further details" << endl; } Ich danke im Voraus für eure Hilfe. P.S.: Sorry fürs falsche Forum - ist mit gerade eben erst aufgefallen! Bitte verschieben. Bearbeitet 28. August 2009 von RoflCopter Falsches Forum Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 31. August 2009 Teilen Geschrieben 31. August 2009 Du brauchst dich nicht mit find und substr herumzuschlagen. getline kann aus jedem Stream lesen, also auch aus einem Stringstream. Du kannst ein eigenes Trennzeichen angeben, also auch ';'.Du brauchst keine WinAPI-Funktion, um eine Datei zu löschen. std::remove aus <cstdio> tut das gleiche. Zudem hast du da keinen Funktionsaufruf, sondern eine Wiederholung der Funktionsdeklaration.Das Kopieren Zeichen für Zeichen ist auch nicht besonders effizient. Du kannst einfach dein Streambuffer des Eingabestreams (daran kommst du mit de rdbuf-Methode) mit dem << Operator auf den Ausgabestream schicken. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 31. August 2009 Autor Teilen Geschrieben 31. August 2009 Hallo Klotzkopp, danke dir für deine Antwort. Den Part mit dem "remove" konnte ich relativ zügig lösen. case 2 : if(!outp) { log << dn << " not found, can't delete the file." << endl; } else { remove(pad.c_str()); log << dn << " deleted" << endl; } Allerdings macht mir der Part mit "rdbuf" etwas zu schaffen, trotz google und msdn - es scheint mir so als ob rdbuf eine Umleitung ist? Quelle: basic_ios::rdbuf // basic_ios_rdbuf.cpp // compile with: /EHsc #include <ios> #include <iostream> #include <fstream> int main( ) { using namespace std; ofstream file( "rdbuf.txt" ); streambuf *x = cout.rdbuf( file.rdbuf( ) ); cout << "test" << endl; // Goes to file cout.rdbuf(x); cout << "test2" << endl; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 31. August 2009 Teilen Geschrieben 31. August 2009 Ich meinte die parameterlose Überladung von rdbuf(): // Datei kopieren ifstream in("quelle"); ofstream out("ziel"); out << in.rdbuf();[/code] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 Danke dir, hätte nicht gedacht, dass es so einfach zu realisieren ist Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 Danke dir, hätte nicht gedacht, dass es so einfach zu realisieren ist Konnte den Beitrag leider nicht editieren, entschuldigt bitte den Doppelpost. Ich habe die Sache mit dem rdbuf einfach realisieren können, das mit dem remove auch. Allerdings kopiert bzw. löscht das Programm nicht wie gewünscht die Dateien. Ich habe es im Debugger geprüft, alle Variablen beinhalten den gewünschten String bzw. Wert. Ich habe zur Sicherheit eine Variable Test hinzugefügt um sicher gehen zu können, dass es nicht am Operator liegt. Anbei der Code. #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <stdlib.h> #include <sstream> // token to op #include <cstdio> // remove using namespace std; void fc_copyfile(string dn, string pad); void fc_append (); void fc_action(); void fc_com (); // global string p, dn, pad, gz, token; stringstream ss (token, istringstream::in | istringstream::out); int op; ofstream log, outp; ifstream inp; int main() { fc_com(); int i = 0; int a = 0; ifstream csv; // Filestream Log-File log.open("Logfile.txt", ios::trunc, ios::binary); // finish log << "Logfile wurde erstellt." << endl; // Filestream csv-File csv.open("csv.txt", ios::binary); // Errorhandling csv-File if(!csv) { log << "CSV-Datei nicht gefunden!" << endl; csv.close(); log.close(); cout << "CSV-Datei nicht gefunden!" << endl; system("PAUSE"); exit (1); } while (!csv.eof()){ getline(csv, gz); i = 0; a = 0; int e = gz.find(";", a); while ( e > 0) { token = gz.substr(a, e-a); a = e + 1; e = gz.find(";", a); i++; switch(i) { case 1 : p = token; break; case 2 : dn = token; break; case 3 : ss << token; ss >> op; break; default: log << "Operator unbekannt!" << endl; } token = gz.substr(a); } fc_append(); // String aneinander hängen fc_action(); // Löschen oder Kopieren } // Ausgabe Kommandobox cout << "Erfolgreich" << endl; log << "Erfolgreich" << endl; // Filestreams schließen csv.close(); log.close(); system("PAUSE"); return 0; } void fc_action () { int test = 1; // zum Testen switch (test) { // << Hier normalerweise op case 1 : if(!inp) { log << dn << " konnte nicht gefunden werden." << endl; } else { fc_copyfile(dn, pad); log << dn << " 1.copyfile wurde kopiert" << endl; } break; case 2 : if(!outp) { log << dn << " konnte nicht gefunden werden." << endl; } else { remove(pad.c_str()); log << dn << " 2.remove wurde gelöscht" << endl; } break; default : log << op << " Operator unbekannt!" << endl; } } void fc_copyfile(string dn, string pad) { ofstream outp; ifstream inp; // Filestreams öffnen inp.open(dn.c_str(), ios::binary); outp.open(pad.c_str(), ios::binary); // Datei kopieren outp << inp.rdbuf(); // Filestreams schließen outp.close(); inp.close(); } void fc_append () { // String aneinander hängen pad = p; pad += dn; } void fc_com () { // Text Kommandobox cout << "Kopieren und Löschen" << endl; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 Werde erst einmal die globalen Variablen los. Erstens ist das kein guter Stil, halte deine Variablen immer so lokal wie möglich. Zweitens ist es nicht gut, denselben fstream für mehrere Dateien zu "recyclen". Der Status des Streams wird nämlich nicht automatisch zurückgesetzt. Du brauchst übrigens Streams nicht manuell zu schließen, das passiert automatisch, wenn sie aus dem Scope laufen. Ein weiterer Vorteil von lokalen Variablen. Der Aufruf von open ist auch unnötig, dafür haben die Streamklassen Konstruktoren: void fc_copyfile(string dn, string pad) { ofstream outp(dn.c_str(), ios::binary); ifstream inp(pad.c_str(), ios::binary); // Datei kopieren outp << inp.rdbuf(); }[/code]Tut dasselbe wie deine Funktion, ist aber irgendwie kürzer, oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 (bearbeitet) Ich war ebenfalls der Meinung, dass ich die Streams nicht manuell zu schließen bzw. zu öffnen brauche - aber meine Mitarbeiter waren da anderer Meinung - haben es als schlechten Stil angesehen ( ich bin Azubi im 2. LJ ) Schonmal danke für deine Hilfe, ich werde mich nun darum kümmern die globalen Variablen weg zu bekommen Edit: Wie sieht es mit den Filestreams wie "log" aus - sollte ich diese auch lokal verwenden oder global? Bearbeitet 1. September 2009 von RoflCopter s.o. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 Ich war ebenfalls der Meinung, dass ich die Streams nicht manuell zu schließen bzw. zu öffnen brauche - aber meine Mitarbeiter waren da anderer Meinung - haben es als schlechten Stil angesehen ( ich bin Azubi im 2. LJ )Du könntest versuchen, diese Mitarbeiter vorsichtig und höflich über RAII zu informieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 (bearbeitet) Eine bescheide Frage aber nun denn.. wenn ich die Variablen nun alle lokal anstatt global verwende, muss ich diese ja auch an die Funktionen übergeben. Wenn ich allerdings schreibe: void fc_action ( int op, string dn, string pad ); // Funktionsprototyp und beim Funktionsaufruf fc_action(); schreibe spuckt der Compiler mir die Meldung aus, dass fc_action(); "Akzeptiert keine 0 Argumente" - daraus lässt sich schließen, dass ich die Variablen auch in den Funktionsaufruf schreiben müsste also: fc_action ( int op, string dn, string pad ); Aber auch da meckert er mit Fehler "error C2660: 'fc_action': Funktion akzeptiert keine 0 Argumente" Ich weiß, dass das eine relativ lächerliche Frage ist - aber die Ausbildungsumstände sind nicht gerade gut da mir u.a. keine Fragen beantwortet werden - danke vorab für eure Hilfe. Edit: Habe es glaub ich selber rausgefunden - beim Funktionsaufruf muss man den Datentyp nicht mit angeben. Bearbeitet 1. September 2009 von RoflCopter s.o. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 void fc_action ( int op, string dn, string pad ); // Funktionsprototyp und beim Funktionsaufruf fc_action(); schreibe spuckt der Compiler mir die Meldung aus, dass fc_action(); "Akzeptiert keine 0 Argumente" richtig, ein int und zwei strings müssen übergeben werden daraus lässt sich schließen, dass ich die Variablen auch in den Funktionsaufruf schreiben müsste also: fc_action ( int op, string dn, string pad ); Aber auch da meckert er mit Fehler "error C2660: 'fc_action': Funktion akzeptiert keine 0 Argumente" Das ist wieder eine Funktionsdeklaration, versuchs mal ohne die Typen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 richtig, ein int und zwei strings müssen übergeben werden Das heißt dann, dass meine Funktion mit einer Kopie arbeitet? Das ist wieder eine Funktionsdeklaration, versuchs mal ohne die Typen. Hat geklappt danke - ist es möglich Filestreams zu übergeben? Der Compiler hat mir als ich in der Deklaration fc_action ( int op, string dn, string pad, ofstream log ); hatte massiv gemeckert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 Das heißt dann, dass meine Funktion mit einer Kopie arbeitet?Richtig. Hat geklappt danke - ist es möglich Filestreams zu übergeben? Der Compiler hat mir als ich in der Deklaration fc_action ( int op, string dn, string pad, ofstream log ); hatte massiv gemeckert.Streams können nicht kopiert werden, daher klappt das so nicht. Deklarier den ofstream-Parameter als Referenz: fc_action ( int op, string dn, string pad, ofstream& log ); Am Aufruf ändert sich nichts. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 (bearbeitet) fc_action ( int op, string dn, string pad, ofstream& log ); Am Aufruf ändert sich nichts. So habe ich es getan, allerdings verlangt der Compiler ein weiteres Argument beim Funktionsaufruf. Das ursprüngliche Problem, das die Dateien nicht kopiert bzw. gelöscht werden bleibt allerdings fortbestehen. Gibt es eine Möglichkeit etwaige Fehler(codes) in einer Variable zu speichern und diese dann anzeigen zu lassen? Beispielsweise "noAccess" oder so, so dass ich meine Funktionen durchtesten kann wo es hapert. Denn der Compiler meckert nicht. Ich habe etwas von Exeptions gelesen, denke allerdings nicht, dass ich damit auf dem richtigen Weg bin. Bearbeitet 1. September 2009 von RoflCopter Rechtschreibung :P Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 So habe ich es getan, allerdings verlangt der Compiler ein weiteres Argument beim Funktionsaufruf.Natürlich musst du dann auch ein Stream-Objekt mitgeben. Ich meinte, beim Aufruf gibt es keinen sichtbaren Unterschied zwischen Value- und Referenzparametern. Das ursprüngliche Problem, das die Dateien nicht kopiert bzw. gelöscht werden bleibt allerdings fortbestehen.Zeig bitte den aktuellen Code. Gibt es eine Möglichkeit etwaige Fehler(codes) in einer Variable zu speichern und diese dann anzeigen zu lassen?Remove hat immerhin einen Rückgabewert, den könntest du ausgeben. Und ob das Erstellen der Streams zum Kopieren geklappt hat, könntest du auch ausgeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 Ich habe den aktuellen Code im Debugger laufen lassen und mir ist aufgefallen das die Variable pad ( string ) keinen Inhalt bekommt. Das aktuelle Ergebnis ist Werk von Testen etc. #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <stdlib.h> #include <sstream> // token to op #include <cstdio> // remove using namespace std; void fc_copyfile(string dn, string pad); void fc_append (string p, string& pad, string dn); void fc_action (int op, string dn, string pad, ofstream& log); void fc_com (void); int main() { string p, dn, pad, gz, token; stringstream ss (token, istringstream::in | istringstream::out); int op = 0; int i = 0; int a = 0; ifstream csv; fc_com(); // Filestream Log-File ofstream log; log.open("Logfile.txt", ios::trunc, ios::binary); if(log.fail()) { cout << "Konnte Logfile.txt nicht erstellen!" << endl; cout << "Programm wird beendet..." << endl; system("PAUSE"); exit(1); } else { log << "Logfile wurde erstellt." << endl; } // Filestream csv-File csv.open("csv.txt", ios::binary); // Errorhandling csv-File if(csv.fail()) { log << "CSV-Datei nicht gefunden!" << endl; cout << "CSV-Datei nicht gefunden!" << endl; system("PAUSE"); exit (1); } while (!csv.eof()){ getline(csv, gz); i = 0; a = 0; int e = gz.find(";", a); while ( e > 0) { token = gz.substr(a, e-a); a = e + 1; e = gz.find(";", a); i++; switch(i) { case 1 : p = token; break; case 2 : dn = token; break; case 3 : ss << token; ss >> op; break; default: log << "Operator unbekannt!" << endl; } token = gz.substr(a); } fc_append(p, dn, pad); // String aneinander hängen fc_action (op, dn, pad, log); // Löschen oder Kopieren } // Ausgabe Kommandobox cout << "Erfolgreich" << endl; log << "Erfolgreich" << endl; // Filestreams schließen csv.close(); log.close(); system("PAUSE"); return 0; } void fc_action (int op, string dn, string pad, ofstream& log) { ifstream inp(dn.c_str(), ios::binary); ofstream outp(pad.c_str(), ios::binary); switch (op) { case 1 : if(inp.fail()) { log << dn << " konnte nicht gefunden werden." << endl; } else { fc_copyfile(dn, pad); log << dn << " wurde kopiert" << endl; } break; case 2 : if(!outp) { log << dn << " konnte nicht gefunden werden." << endl; } else { remove(pad.c_str()); log << dn << " wurde gelöscht" << endl; } break; default : log << op << " Operator unbekannt!" << endl; } } void fc_copyfile(string dn, string pad) { ofstream outp(pad.c_str(), ios::binary); ifstream inp(dn.c_str(), ios::binary); if(inp.fail()) { cout << "inp.failed.fc_copyfile" << endl; } if(outp.fail()) { cout << "outp.failed.fc_copyfile" << endl; } // Datei kopieren outp << inp.rdbuf(); } void fc_append (string p, string& pad, string dn) { // String aneinander hängen pad = p; pad += dn; } void fc_com (void) { // Text Kommandobox cout << "Kopieren & Loeschen" << endl; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 Ich habe den aktuellen Code im Debugger laufen lassen und mir ist aufgefallen das die Variable pad (string) keinen Inhalt bekommt. void fc_append (string p, [B]string& pad[/B], string dn); fc_append(p, [B]dn[/B], pad); // String aneinander hängen Parameter vertauscht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 1. September 2009 Autor Teilen Geschrieben 1. September 2009 Hallo TDM, ja das war ein Punkt - ist mir vorhin auch aufgefallen und habe es nun geändert. String pad bekommt nun wieder den korrekten Inhalt. Dennoch habe ich noch bei "remove(pad.c_str())" einen Wurm drin - dieser löscht die Dateien nicht. Und über die Logfile reden wir erst gar nicht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. September 2009 Teilen Geschrieben 1. September 2009 Beim Kopieren öffnest du die Dateien in fc_action, und in fc_copyfile öffnest du sie nochmal. Das zweite Öffnen zum Schreiben dürfte fehlschlagen, daher klappt wohl das Kopieren nicht. Und beim Löschen öffnest du die Datei auch vorher. Eine geöffnete Datei kann man nicht löschen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 2. September 2009 Autor Teilen Geschrieben 2. September 2009 (bearbeitet) Hallo Klotzkopp, danke dir für die Antwort - es funktioniert nun immerhin zu einem Teil. Die Erste eingelesene Zeile meiner .txt Datei wird korrekt ausgeführt, alle danach folgenden Zeilen werden fehlerhaft interpretiert. So wird z.B. in der .txt Datei angegeben durch den Operator "2" das die Datei gelöscht werden soll, dies passiert allerdings bei der Ersten Zeile ( wo es korrekt ist ) - aber auch alle nachstehenden Dokumente welche sich an anderen Orten befinden werden gelöscht ( es wird zumindest versucht, da es diese Dateien nicht gibt, da diese eigentlich erst dort hin kopiert werden ) Wenn ich allerdings in der Ersten Zeile den Operator "1" für Kopieren verwende, versucht er sämtlichen nachfolgenden Zeilen ebenfalls zu kopieren. Welche im Ordner allerdings nicht existieren ( Zielordner ). Danke vorab für eure Hilfe. Edit: Ich werde den Code gleich anhängen. #include <iostream> #include <fstream> #include <string> #include <windows.h> #include <stdlib.h> #include <sstream> // token to op #include <cstdio> // remove using namespace std; void fc_copyfile(string dn, string pad); void fc_append (string p, string& pad, string dn); void fc_action (int op, string dn, string pad, ofstream& log); void fc_com (void); int main() { string p, dn, pad, gz, token; stringstream ss (token, istringstream::in | istringstream::out); int op = 0; int i = 0; int a = 0; // Filestream Log-File ofstream log; log.open("Logfile.txt", ios::trunc, ios::binary); if(log.fail()) { cout << "Konnte Logfile.txt nicht erstellen!" << endl; cout << "Programm wird beendet..." << endl; system("PAUSE"); } else { log << "Logfile wurde erstellt." << endl; } // Filestream csv-File ifstream csv("csv.txt", ios::binary); fc_com(); // Errorhandling csv-File if(csv.fail()) { log << "CSV-Datei nicht gefunden!" << endl; cout << "CSV-Datei nicht gefunden!" << endl; system("PAUSE"); exit (1); } // Einlesen von Zeile ( gz ) von csv, anschließend werden anhand ';' Tokens erstellt while (!csv.eof()){ i = 0; a = 0; getline(csv, gz); int e = gz.find(";", a); while ( e > 0) { token = gz.substr(a, e-a); a = e + 1; e = gz.find(";", a); i++; switch(i) { case 1 : p = token; break; case 2 : dn = token; break; case 3 : ss << token; ss >> op; break; default: log << "Operator unbekannt!" << endl; } token = gz.substr(a); } fc_append(p, pad, dn); // String aneinander hängen fc_action (op, dn, pad, log); // Löschen oder Kopieren } // Ausgabe Kommandobox //cout << "Erfolgreich" << endl; //log << "Erfolgreich" << endl; system("PAUSE"); return 0; } void fc_action (int op, string dn, string pad, ofstream& log) { switch (op) { case 1 : if(pad.c_str()) { fc_copyfile(dn, pad); log << dn << " wurde kopiert" << endl; } else { log << dn << " Error.case1_op" << endl; } break; case 2 : if(pad.c_str()) { remove(pad.c_str()); log << dn << " wurde gelöscht" << endl; } else { log << dn << " Error.case2_op" << endl; } break; default : log << op << " Operator unbekannt!" << endl; } } void fc_copyfile(string dn, string pad) { ofstream outp(pad.c_str(), ios::binary); ifstream inp(dn.c_str(), ios::binary); if(inp.fail()) { cout << "inp.failed.fc_copyfile" << endl; } if(outp.fail()) { cout << "outp.failed.fc_copyfile" << endl; } // Datei kopieren outp << inp.rdbuf(); } void fc_append (string p, string& pad, string dn) { // String aneinander hängen pad = p; pad += dn; } void fc_com (void) { // Text Kommandobox cout << "Kopieren & Loeschen" << endl; } Bearbeitet 2. September 2009 von RoflCopter Code aktualisiert Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 Mach deine Variablen so lokal wie möglich. Das ist nicht C, wo man alle Variablen am Anfang deklariert. Dann sollte das Problem verschwinden. Ich vermute die Ursache nämlich darin, dass du den Stringstream nicht zurücksetzt. Da steht noch der Operator von der vorhergehenden Zeile drin. Ich hatte dir auch vorher schon den Hinweis gegeben, dass du find und substr nicht brauchst. Deine Token-Suchschleife lässt sich stark vereinfachen: string gz; while (getline(csv, gz)){ string p, dn; int op = 0; istringstream line(gz); getline(line, p, ';'); getline(line, dn, ';'); line >> op; fc_action (op, dn, p + dn, log); // Löschen oder Kopieren } [/code] Ein paar Anmerkungen noch: Mehrere Flags verkettet man mit |, nicht mit Komma. Und c_str liefert niemals Null, die entsprechenden if-Abfragen sind also sinnlos. Falls der String leer ist, liefert c_str einen Zeiger auf einen leeren String. Wenn du eine rudimentäre Gültigkeitsprüfung machen willst, benutz std::string::length. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
RoflCopter Geschrieben 2. September 2009 Autor Teilen Geschrieben 2. September 2009 Danke dir Klotzkopp, das war die Lösung. :bimei Diese gigantische Suchschleife war nicht mein Werk - bzw. diese wurd mir so als "optimal" vorgegeben. Ich solle lernen wie man "damals" ohne die "Super Funktionen etc. pp" klar kommen musste. Auf mein Argument, dass wir ihm HEUTE angekommen sind ging niemand ein. Bis ich den alt - eingesessenen Kollegen davon überzeugt habe werde ich wohl einiges an Berufserfahrung haben.. Ebenfalls mit den lokalen Variablen - wird hier als "schlecht" und "unlesbar" etc. betitelt - kann mich da relativ schlecht gegen wehren. Es war schon schwer genug meinen Mitarbeiter ( welcher mir "helfen" soll ) dazu zu bringen, das wir das Copy à la char by char raus nehmen. Zu deinem Link haben diese mir übrigens nichts gesagt - pure Verblüffung kam ans Tageslicht und alle sind sich einen Kaffee holen gegangen.. Nochmals danke an alle Beteiligten - scheinbar muss ich mehr auf mich hören und auch auf google bzw. diverse Foren Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. September 2009 Teilen Geschrieben 2. September 2009 Ich solle lernen wie man "damals" ohne die "Super Funktionen etc. pp" klar kommen musste. Auf mein Argument, dass wir ihm HEUTE angekommen sind ging niemand ein.Manchmal hilft da das Argument, dass man ja auch die alten Lochstreifen wieder rausholen könnte. Aber sei besser behutsam und überzeuge durch Ergebnisse. Bis ich den alt - eingesessenen Kollegen davon überzeugt habe werde ich wohl einiges an Berufserfahrung haben..Ja, das kann unter Umständen sehr lange dauern. Manchmal bauen sich über die Jahre sehr große Scheuklappen auf. Gegen "Das haben wir schon immer so gemacht" ist kaum ein Kraut gewachsen. Ebenfalls mit den lokalen Variablen - wird hier als "schlecht" und "unlesbar" etc. betitelt - kann mich da relativ schlecht gegen wehren. Es war schon schwer genug meinen Mitarbeiter ( welcher mir "helfen" soll ) dazu zu bringen, das wir das Copy à la char by char raus nehmen.Deine Kollegen kennen das vermutlich nicht anders. Unlesbar ist das nur, wenn man es nicht gewohnt ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.