fstream: FileOut.write funktioniert nicht
-
Hallo!
Leider funktioniert bei mir FileOut.write nicht. Die Ausgabedatei ist nach dem Schreibgang immer 0 Byte groß. Warum? Die IF-Abfrage (if (FileOut.is_open()))wird übrigens immer mit true ausgeführt.
#include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { char *buffer; unsigned char *datei; unsigned long long FileSize; unsigned long long i; fstream FileIn("D:\\Programme\\Unsortiert\\test\\1", ios::in|ios::binary); if (FileIn.is_open()) { FileIn.seekg(0, ios::end); FileSize = streamoff(FileIn.tellg()); FileIn.seekg(0, ios::beg); buffer = new char[FileSize]; datei = new unsigned char[FileSize]; FileIn.read(buffer, FileSize); for (int i=0; i < FileSize; i++) { datei[i] = (unsigned char)buffer[i]; } /* hier wird datei bearbeitet */ fstream FileOut("D:\\Programme\\Unsortiert\\test\\2", ios::out|ios::binary); if (FileOut.is_open()) { FileOut.seekg(0, ios::beg); buffer = new char[FileSize]; for (i=0; i < FileSize; i++) { buffer[i] = (signed char)datei[i]; } FileOut.write(buffer, FileSize); } } return 0; }
-
Teste mal nicht auf .is_open() sondern auf .good():
if(File.good())
is_open: Liefer einen wahren Wert zurück, wenn der entsprechede Stream ordnungsgemäß geöffnet ist.
good: Liefer einen wahren Wert zurück, wenn der Stream in einem fehlerlosen Zustand ist.
Außerdem meine ich muss man die Dateiendung mit angeben.EDIT:
Ich habe eben nochmal getestet, deine erste if-abfrage scheitert schon!!!!! Da komme ich in einem von mir eben eingefügten else-Zweig. Du musst also auf jedenfall eine Dateiendung mit angeben!!!!
Noch etwas: Es kommen bei mir sehr viele Warnungnen! Diese solltest du beheben.Code-Hacker
-
Und das, obwohl vor Memory-Leaks noch nicht einmal gewarnt wird. Statt der ganzen dynamischen Arrays besser std::vector nehmen -> siehe Standardbibliotheksdokumentation deiner Wahl. Die temporären Buffer sind außerdem unnötig, caste einfach den Zeiger auf die Arrays/Vektoreninhalte:
... std::vector<unsigned char> datei(FileSize); ... FileIn.read(static_cast<char*>(&datei.front()), datei.size()); ...
-
Danke für die vielen Antworten.
Die beiden Dateien haben keine Dateiendung, daher darf da auch keine sein. Con Vektoren habe ich keine Ahnung. Deshalb möchte ich auch die Finger davon lassen und lieber bei den dynamischen Arrays bleiben.
Ich bekomme folgende Warnungen:
37: warning: name lookup of `i' changed 12: warning: matches this `i' under ISO 25: warning: matches this `i' under old
Ich kann damit aber nichs anfangen.
-
Du hast eine Variable i einmal oben und einmal innerhalb der for-Schleife verwendet. Das Verhalten ist unterschiedlich in verschiedenen Versionen des C-Standards.
Zum Grundproblem:
Du solltest nach dem write() ein close() für die Datei machen.
-
Hallo!
Danke für die Antwort. Ich habe den Quelltext entsprechend geändert. Aber leider ist das Problem immer noch nicht behoben. Es kommen nur keine Warnungen mehr.
#include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { char *buffer; unsigned char *datei; unsigned long long FileSize; unsigned long long i; fstream FileIn("D:\\Programme\\Unsortiert\\test\\1", ios::in|ios::binary); if (FileIn.good()) { FileIn.seekg(0, ios::end); FileSize = streamoff(FileIn.tellg()); FileIn.seekg(0, ios::beg); buffer = new char[FileSize]; datei = new unsigned char[FileSize]; FileIn.read(buffer, FileSize); for (i=0; i < FileSize; i++) { datei[i] = (unsigned char)buffer[i]; } FileIn.close(); /* hier wird datei bearbeitet */ fstream FileOut("D:\\Programme\\Unsortiert\\test\\2", ios::out|ios::binary); if (FileOut.good()) { FileOut.seekg(0, ios::beg); buffer = new char[FileSize]; for (i=0; i < FileSize; i++) { buffer[i] = (signed char)datei[i]; } FileOut.write(buffer, FileSize); FileOut.close(); } } return 0; }
-
Hmmm...ich hatte mehr Fehler als nur diese 3. Da waren noch so Sachen wie irgendwas mit signed und unsigned. Habe aber nicht genau darauf geachtet. Naja, egal.
Datei ohne Dateiendung??? Verstehe ich nicht, was ist denn das dann für eine Dateityp? Also bei mir stehen die Dateiendungen auch nicht immer mit dran, aber er verlangt die, sonst findet er das File nicht. Habe es eben auch nochmal getestet, er findet die Datei gar nicht ohne das ich ihm die Endung nenne.
EDIT: Du solltest außerdem else-Zweige erstellen um zu gucken wa nicht klappt, damit man sehen kann wo er gescheitert ist.
Code-Hacker
-
wenn die datei eine endung hat, musst du sie mit angeben. aber nicht alle dateien haben eine endung.
-
gast schrieb:
Die beiden Dateien haben keine Dateiendung, daher darf da auch keine sein. Con Vektoren habe ich keine Ahnung. Deshalb möchte ich auch die Finger davon lassen und lieber bei den dynamischen Arrays bleiben.
bei dynamischen Arrays hast du aber auch nicht den überblick, den sonst würdes du nicht das delete[] weglassen
-
hast du schon versucht in die datei zu schreiben mit was anderen als write, z.b. put oder op<< (nur um zu sehen obs wirklich an write liegt)
-
Hallo!
Die Datei "1" ist einfach eine selbsterstellte Datei mit 6 zufälligen Bytes. Die Datei "2" ist 0 Bytes groß. Ich habe den selbsterstellten Dateien KEINE Dateiendung gegeben.
Ich bin in C++/C relativ neu. Ich habe vorher nur Delphi, PHP und CGI gemacht.
-
Es liegt definitiv an "FileOut.write(buffer, FileSize);". Ich habe in die Datei "1" einfach mal einen Text reingeschrieben und vor dem Write-Befehl buffer mit Hilfe von cout ausgegeben. Die Ausgabe entspach genau dem Text in der Datei "1".
-
Hallo!
Ich habe jetzt selber hinbekommen. Ich habe statt fstream ifstream und ofstream verwendet. Gibt es die Möglichkeit die Datei direkt in "datei" zuschreiben anstatt in "buffer"? Bei großen Dateien ist das ganze noch extrem langsam.
#include <iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]) { char *buffer; unsigned char *datei; unsigned long long FileSize; unsigned long long i; ifstream FileIn("D:\\Programme\\Unsortiert\\test\\1", ios::binary|ios::in); if (FileIn.good()) { FileIn.seekg(0, ios::end); FileSize = streamoff(FileIn.tellg()); FileIn.seekg(0, ios::beg); buffer = new char[FileSize]; datei = new unsigned char[FileSize]; FileIn.read(buffer, FileSize); for (i=0; i < FileSize; i++) { datei[i] = (unsigned char)buffer[i]; } FileIn.close(); /* hier wird datei bearbeitet */ ofstream FileOut("D:\\Programme\\Unsortiert\\test\\2", ios::binary|ios::out); if (FileOut.good()) { buffer = new char[FileSize]; for (i=0; i < FileSize; i++) { buffer[i] = (signed char)datei[i]; } cout << FileSize << " - " << buffer << "\n"; system("PAUSE"); //FileOut.seekg(0, ios::beg); FileOut.write(buffer, FileSize); FileOut.close(); } } return 0; }
-
gast schrieb:
Ich habe statt fstream ifstream und ofstream verwendet.
Andersrum. Du hast statt ifstream und ofstream fstream verwendet.
Was das mit der Dateiendung auf sich hat so hat sich das erledigt. Ich habe bei mir Dateiendung anzeigen ausgestellt. Wenn ich sie anstelle kann ich sehen wer eine Endung hat und wer nicht.
Code-Hacker