Zum Inhalt springen

Problem beim binären kopieren einer Datei


min2Max

Empfohlene Beiträge

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 von min2Max
Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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);

;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...