Probleme mit FILE* ("ýýýý««««««««þîþ" am ende des Strings)
-
Liebe Leser
Ich bin neu hier. Ich habe das Forum gewechselt. Bisher war ich immer auf "www.Spieleprogrammierer.de" aktiv. Jedoch entwickle ich Anwendungen dieser Art nicht mehr. Deswegen bin ich jetzt hier.
Ich hoffe ich bin im richtigen Bereich.
Ich entwickle aktuell ein Programm, mit dem man Dateien Binär laden und verschlüsseln kann. Bisher geht es nur ums Prinzip. Die Verschlüsselung funktioniert perfekt, jedoch habe ich ein Problem beim Laden der Quelldatei.
Als GUI-Framework nehme ich wxWidgets.
Programmiersprache --> C++ (VS2013)Hier ist die Ladenfunktion für die Quelldatei
// Wir löschen alles, damit man mehrere Dateien bearbeiten kann. // FILE Erstellen struct stat FileState; FILE* mpFile = new FILE; // Datei Statistiken Laden ZeroMemory(&FileState, sizeof(struct stat)); stat(pcFileName, &FileState); if (FileState.st_size <= 0) return PR_ERROR; // Die Puffer Initialisiern mpPufferA = new BYTE[FileState.st_size]; mpPufferB = new BYTE[FileState.st_size]; mpPufferC = new BYTE[FileState.st_size]; // Informationen über Datei Speichern miNumByte = FileState.st_size; // Datei Binär zum lesen Öffnen mpFile = fopen(pcFileName, "rb"); if (!mpFile) { return PR_ERROR; } // Datei Öffnen // mpPufferA ist vom typ BYTE* if (fread(mpPufferA, FileState.st_size, 1, mpFile) != 1) { return PR_ERROR; } // File Schließen fclose(mpFile); // Die Datei wurde Erfolgreich Binär geladen char *pcString = new char[256]; sprintf(pcString, "Datei erfolgreich geladen(%i Byte)", miNumByte); AddLog(pcString); mbIsInit = TRUE; // return OK return PR_OK;Das Problem ist, dass im Puffer (BYTE *mpPufferA;) am ende des Strings eine Zeichenfolge steht, die nicht in der Datei steht. Es ist wichtig, das diese weg ist.
(wegen der Verschlüsselung)wenn ich statt BYTE*, void* nehme hilft das auch nicht.
Wenn ich eine Textdatei Binär lade, wo "HALLO WELT" drinsteht,
steht bei mir im Programm "HALLO WELTýýýý««««««««þîþ"."ýýýý««««««««þîþ" gehört nicht dazu. Es gibt schon Threads darüber, die haben mir jedoch nicht weiter geholfen.Das läuft bei binäre Dateien genauso falsch.
PS: Normal schreibe ich keine so langen Romane.
-
wie siehst du denn, dass das da hintendran steht?
-
Was du da programmierst ist kein C++. Das einzige, was in deinem Code mit C++ zu tun hat ist "new". Du solltest lieber mal Projekte wie Spiele oder Verschlüsselung zurückstellen und ordentlich C++ lernen. Oder du programmierst halt C (dann aber konsequent und nicht dieses furchtbare C++/C-Gemisch).
Zu deinem Problem: Wo steht das in deinem Programm? Du weißt doch ganz genau, wie lang der String ist, den du gelesen hast. Wenn du dann noch mehr Zeichen liest, erzeugst du halt einen Pufferüberlauf (UB). Wenn du aus den eingelesen Daten einen C-String machen willst, brauchst du eine Nullterminierung. Wenn dir das kein Begriff ist, dann bist du definitiv noch nicht soweit mit dem Programmieren von komplexeren Sachen.
-
FILE* mpFile = new FILE;Ich muss ja sagen, ich habe hier schon so einiges gesehen. Aber das hier ist sicher unter den Top 10 der bizarrsten Verfehlungen. Ich bin sogar überrascht, dass das überhaupt compiliert, da ich hinter FILE eine reine Deklaration vermutet hätte.
@Threadersteller: Es mag zwar grob klingen, aber Jodocus hat 100% Recht. Alles was du über C und C++ gelernt hast, gehört sofort vergessen und nochmal von vorne mit dem Lernprozess angefangen. Dieses Mal nur eine der beiden Sprachen gleichzeitig und außerdem nicht versuchen, Java in einer anderen Sprache zu programmieren. So wie du derzeit programmierst ist für die Tonne und du wirst in keiner der beiden Sprachen jemals irgendetwas zustande bringen.
-
Weißt du wie ZEeichenketten (Strings) in C impelementiert sind?
-
SeppJ schrieb:
FILE* mpFile = new FILE;Ich muss ja sagen, ich habe hier schon so einiges gesehen. Aber das hier ist sicher unter den Top 10 der bizarrsten Verfehlungen. Ich bin sogar überrascht, dass das überhaupt compiliert, da ich hinter FILE eine reine Deklaration vermutet hätte.
Erst mit dem nächsten Visual Studio (2015?). Wenn der TE also irgendwann mal seine VS-Installation aktualisiert, wird sein Code nicht mehr kompilieren.
-
Ok: Ihre habt wohl recht.
Ich habe schon überlegt ein Buch zu besorgen
Was C++ zu 100 % behandelt. Weil meine kenntnis
(Nach eigener Meinung) ziemlich brüchig sind.Könnt ihre mir eins empfehlen?
Ich persönlich habe mich nie mit C beschäftigt.
Ich kenne keine Syntex von C. Mir ist nie bewußt gewesen,
Das ich etwas vermischte.Naja. Danke für die Infos und Ratschläge.
-
Sebastian Müller schrieb:
Ich persönlich habe mich nie mit C beschäftigt
Mit C++ aber auch nicht, sonst wüßtest du die Unterschiede.
Sebastian Müller schrieb:
Ich kenne keine Syntex von C. Mir ist nie bewußt gewesen, Das ich etwas vermischte.
(Sehr) viel C-Code ist auch gültiger C++-Code.
Aber (modernes) C++ wird anders programmiert.
-
Ok. Kann mir jemnad ein buch empfehlen?
-
Sebastian Müller schrieb:
Ok. Kann mir jemnad ein buch empfehlen?
- C++ Primer (5th Edition) vov Lippmann
- Der C++ Programmierer von BreymannSuch dir eins aus. Es beides Bücher für Anfänger.
-
Schau mal in die Signatur von SeppJ
z.B. bei http://www.c-plusplus.net/forum/p2410545#2410545
-
Nur aus Interesse.
Wie sieht der Code eurer Meinung nach oben in 100 % C++ aus?
Ich bin jetzt mal gespannt.Ich hole mir das Buch von Breymann.
Behandelt es auch die komplette Sprache (0 - 100)?
-
Sebastian Müller schrieb:
Wie sieht der Code eurer Meinung nach oben in 100 % C++ aus?
Ich bin jetzt mal gespannt.Da können jetzt 100 verschiedene Antworten kommen. Zumal vieles in deinem Code so unschön ist, dass es den C++-Code unschön machen würde, wenn man es direkt so übernähme. Z.B. würde man die benutzte AddLog-Funktion in C++ sicherlich anders machen. Und du benutzt globale Variablen, was man weder in C noch C++ machen sollte, aber ohne genau zu wissen, was im Rest deines Programms passiert, kann man schwer sagen, wie es besser ginge (das ist ja gerade ein Problem von globalen Variablen, dass man das ganze Programm kennen muss, um lokal Aussagen über das Programmverhalten treffen zu können). Daher zeig ich mal nur einlesen einer Datei in ein Datenfeld.
Eine bewusst für den Uneingeweihten unleserliche, aber dafür sehr kurz und knackige, Lösung wäre:
#include <vector> #include <iostream> #include <fstream> #include <iterator> int main() { using namespace std; ifstream file("test.dat", ios::binary); vector<char> data((istreambuf_iterator<char>(file)), istreambuf_iterator<char>()); clog << "Datei erfolgreich geladen(" << data.size() <<" Byte)\n"; }Das dürfte von den meisten Lesern hier aber ohne Probleme verstanden werden (wobei viele sich vielleicht ein paar Sekunden über die scheinbar überflüssigen Klammern in Zeile 10 wundern und dann ein kleines Aha!-Erlebnis haben werden).
-
SeppJ schrieb:
wobei viele sich vielleicht ein paar Sekunden über die scheinbar überflüssigen Klammern in Zeile 10 wundern und dann ein kleines Aha!-Erlebnis haben werden).
Für solche Fälle habe ich die Paranthesen schon entlassen und die {} eingestellt.
-
vector<char> data(istreambuf_iterator<char>{file}, {});Ja, die arbeiten besser, nicht wahr?
@SeppJ: Warum
clog?
-
Personalchef schrieb:
Für solche Fälle habe ich die Paranthesen schon entlassen und die {} eingestellt.
Prima Fremdwort, aber in welchem Zusammenhang bedeutet es "runde Klammern"?
-
volkard schrieb:
Personalchef schrieb:
Für solche Fälle habe ich die Paranthesen schon entlassen und die {} eingestellt.
Prima Fremdwort, aber in welchem Zusammenhang bedeutet es "runde Klammern"?
Korrektur:
<en_US>parantheses</en_US>
-
Hallo zusammen
Ich bestelle mir folgendes Buch
Es ist Top aktuell und behandelt auch C++11.
Wobei ich mich immer fragte, was 11 bedeutet.
-
Geburtsdatum des Standards (+/- ein paar Jährchen)
-
Sebastian Müller schrieb:
Es ist Top aktuell und behandelt auch C++11.
Topaktuell wäre C++14.