min2Max Geschrieben 2. November 2009 Teilen Geschrieben 2. November 2009 (bearbeitet) Hey FI-Community! Zuerst: "Hello World" Das wird mein erster Eintag hier. Und zwar..: Hab ein kleines Problem mit meinem C++ -Code und hoffe ihr könnt mir helfen. Und zwar soll ich in meinem Praktikum als Übung (bin noch n "Frischling"^^) eine Datei binär teilen und wieder zusammenfügen. Hier erstmal mein bisheriger Code: BINÄR TEILEN: #include <iostream> #include <string> #include <fstream> #include <cstdlib> #include <unistd.h> using namespace std; int main() { system("clear"); // deklarieren // ... string filePath; string fileName; string fileName1; string fileName2; char *content1; char *content2; long len; long pos; long pos2; int cut; int i; int x; bool restart; cout << "#########<<<<#########>>>>######### " << endl; cout << "#Dateien#<<<<##binär##>>>>#spliten# " << endl; cout << "#########<<<<#########>>>>######### " << endl; do { do { // eingabe Pfad // bestimmung der Dateinamen // ... cout << "\nPfad zu der zu splitenden Datei: " << endl; cin >> filePath; cut = filePath.rfind("/"); fileName.insert(0, filePath.substr(cut)); fileName1 = filePath.substr(0, cut) + fileName + "-1"; fileName2 = filePath.substr(0, cut) + fileName + "-2"; // Abfrage ob Pfad ok // ... if(filePath[0] != (char)47) { cerr << "Falsche Eingabe!" << endl; restart = true; } else(filePath[0] == (char)47); { restart = false; } } while(restart == true); cout << fileName1 << endl; cout << fileName2 << endl; // Dateien öffnen // ... ifstream fileIn(filePath.c_str(), ios_base::binary); ofstream fileOut1(fileName1.c_str()ios_base::binary); ofstream fileOut2(fileName2.c_str()ios_base::binary); // Dateilänge bestimmen // ... fileIn.seekg(0, ios_base::end); len = fileIn.tellg(); pos = len / 2; pos2 = len - pos; cout << pos << " pos" << endl; cout << len << " len" << endl; // Speicher erstellen // ... content1 = new char[len]; content2 = new char[len]; // Daten in 2 Schritten kopieren // ... fileIn.seekg(0, ios_base::beg); fileIn.read(content1, 1); fileIn.seekg(pos, ios_base::beg); fileIn.read(content2, 1); // Daten in neue Dateien schreiben // ... fileOut1.write(content1, pos); fileOut2.write(content2, pos2); // Dateien schließen // ... fileOut2.close(); fileOut1.close(); fileIn.close(); // Speicher freigeben // ... delete[] content1; delete[] content2; cout << "Again? Type '1'" << endl; cin >> x; } while(x == 1); // Programmende // ... for(i=0; i<3; i++) { if(i == 2) { cout << "thank you for using!" << endl; cout << "END" << endl; sleep(2); break; } cout << "......" << endl; sleep(1); } system("clear"); return 0; } BINÄR ZUSAMMENFÜGEN: #include <iostream> #include <string> #include <fstream> #include <cstdlib> #include <unistd.h> using namespace std; int main() { system("clear"); // deklarieren // ... string filePath1; string filePath2; string fileNew; char *content1; char *content2; long length1; long length2; int cut1; int cut2; int i; int x; bool restart; cout << "#########\t+\t#########\t=\t############### " << endl; cout << "#Dateien#\t+\t##binär##\t=\t#zusammenfügen# " << endl; cout << "#########\t+\t#########\t=\t############### " << endl; do { do { // eingabe Pfad // bestimmung der Dateinamen // ... cout << "\nPfad zu der ersten Datei: " << endl; cin >> filePath1; cout << "\nPfad zu der zweiten Datei: " << endl; cin >> filePath2; cut1 = filePath1.rfind("/"); cut2 = filePath2.rfind("/"); fileNew = filePath1.substr(0, cut1) + "/FILE"; cout << fileNew << endl; cout << filePath1 << endl; cout << filePath2 << endl; // Abfrage ob Pfad ok // ... if(filePath1[0] != (char)47) { cerr << "Falsche Eingabe!" << endl; restart = true; } else(filePath1[0] == (char)47); { restart = false; } if(filePath2[0] != (char)47) { cerr << "Falsche Eingabe!" << endl; restart = true; } else(filePath2[0] == (char)47); { restart = false; } } while(restart == true); // Dateien öffnen // ... ofstream fileOut(fileNew.c_str()); ifstream fileIn1(filePath1.c_str(), ios_base::binary); ifstream fileIn2(filePath2.c_str(), ios_base::binary); // Dateilänge bestimmen // ... fileIn1.seekg(0, ios_base::end); fileIn2.seekg(0, ios_base::end); length1 = fileIn1.tellg(); length2 = fileIn2.tellg(); // Speicher erstellen // ... content1 = new char[length1]; content2 = new char[length2]; // Daten in 2 Schritten kopieren // ... fileIn1.seekg(0, ios_base::beg); fileIn2.seekg(0, ios_base::beg); fileIn1.read(content1, 1); fileIn2.read(content2, 1); // Daten in neue Dateien schreiben // ... fileOut.write(content1, length1); fileOut.write(content2, length2); // Dateien schließen // ... fileIn2.close(); fileIn1.close(); fileOut.close(); // Speicher freigeben // ... delete[] content1; delete[] content2; cout << "Again? Type '1'" << endl; cin >> x; } while(x == 1); // Programmende // ... for(i=0; i<3; i++) { if(i == 2) { cout << "thank you for using!" << endl; cout << "END" << endl; sleep(2); break; } cout << "......" << endl; sleep(1); } system("clear"); return 0; } Das mit dem Teilen klappt auch schon ganz gut nur wenn ich meine Datei wieder zusammenfügen will bekommt die Datei in die ich die Daten schreibe den typ "Unbekannt" und lässt sich nicht mehr öffnen. Ich hoffe ihr könnt mir helfen. LG Chris Bearbeitet 2. November 2009 von min2Max Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 2. November 2009 Teilen Geschrieben 2. November 2009 fileIn.read(content1, 1); Der zweite Parameter von ifstream::read ist die Anzahl der Bytes, die gelesen werden sollen. Du gibst da immer nur 1 an. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
min2Max Geschrieben 3. November 2009 Autor Teilen Geschrieben 3. November 2009 Danke dir! So tuts : TEILEN: // Dateien öffnen // ... ifstream fileIn(filePath.c_str(), ios_base::binary); ofstream fileOut1(fileName1.c_str(), ios_base::binary); ofstream fileOut2(fileName2.c_str(), ios_base::binary); // Dateilänge bestimmen // ... fileIn.seekg(0, ios_base::end); len = fileIn.tellg(); pos = len / 2; pos2 = len - pos; cout << pos << " pos" << endl; cout << len << " len" << endl; // Speicher erstellen // ... content1 = new char[len]; content2 = new char[len]; // Daten in 2 Schritten kopieren // ... fileIn.seekg(0, ios_base::beg); fileIn.read(content1, pos); fileIn.seekg(pos, ios_base::beg); fileIn.read(content2, len-pos); // Daten in neue Dateien schreiben // ... fileOut1.write(content1, pos); fileOut2.write(content2, pos2); // Dateien schließen // ... fileOut2.close(); fileOut1.close(); fileIn.close(); // Speicher freigeben // ... delete[] content1; delete[] content2; ZUSAMMENFÜGEN: // Dateien öffnen // ... ofstream fileOut(fileNew.c_str()); ifstream fileIn1(filePath1.c_str(), ios_base::binary); ifstream fileIn2(filePath2.c_str(), ios_base::binary); // Dateilänge bestimmen // ... fileIn1.seekg(0, ios_base::end); fileIn2.seekg(0, ios_base::end); length1 = fileIn1.tellg(); length2 = fileIn2.tellg(); // Speicher erstellen // ... content1 = new char[length1]; content2 = new char[length2]; // Daten in 2 Schritten kopieren // ... fileIn1.seekg(0, ios_base::beg); fileIn2.seekg(0, ios_base::beg); fileIn1.read(content1, length1); fileIn2.read(content2, length2); // Daten in neue Dateien schreiben // ... fileOut.write(content1, length1); fileOut.write(content2, length2); // Dateien schließen // ... fileIn2.close(); fileIn1.close(); fileOut.close(); // Speicher freigeben // ... delete[] content1; delete[] content2; aber... wenn das Programm zum spliten in die Schleife kommt und ich ein zweites Mal einen Pfad angeb werden pos = 0 und len-pos= -1 und ich bekomm die Meldung: termiinate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Was ist den nu falsch? lg Chris Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 3. November 2009 Teilen Geschrieben 3. November 2009 Mal etwas Grundsätzliches: if(filePath[0] != (char)47) { cerr << "Falsche Eingabe!" << endl; restart = true; } else(filePath[0] == (char)47); { restart = false; }[/code] Dieser Code tut nicht, was du erwartest. Ich rücke das mal richtig ein und entferne überflüssige Klammern: [code]if(filePath[0] != (char)47) { cerr << "Falsche Eingabe!" << endl; restart = true; } else filePath[0] == (char)47; restart = false; Man gibt bei else keine weitere Bedingung an. Das wäre auch Unsinn, der else-Zweig wird automatisch ausgeführt, wenn die Bedingung am if-Zweig false war. Dein else-Zweig ist der Vergleich, der natürlich sonst keinen weiteren Effekt hat. Die Zuweisung dahinter wird also auf jeden Fall ausgeführt. Zudem solltest du alle deine Variablen so lokal wie möglich deklarieren und auch auf jeden Fall initialisieren. Kann gut sein, dass dein Programm schon richtig läuft, wenn du diese zwei Punkte umsetzt. Und noch eins: while(restart == true); restart selbst ist bereits ein bool-Ausdruck, der Vergleich mit true ist überflüssig. Ist eine Geschmacksfrage, aber wenn ich so etwas sehe, frage ich mich, warum nicht gleich: while(restart == true == true == true); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
min2Max Geschrieben 3. November 2009 Autor Teilen Geschrieben 3. November 2009 Nochmal danke an dich Prog läuft :) Das mit dem "else" hatte ich schon gesehen und geändert.. Das mit dem "restart" war mir neu.. merci 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.