Probleme mit FILE* ("ýýýý««««««««þîþ" am ende des Strings)



  • 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.


  • Mod

    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 Breymann

    Such 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)?


  • Mod

    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.


  • Mod

    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

    http://www.amazon.de/Der--Programmierer-professionell-anwenden-Lösungen/dp/3446438947/ref=sr_1_1?ie=UTF8&qid=1406475733&sr=8-1&keywords=der+c%2B%2B+programmierer

    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.



  • Ja aber das reicht mir.
    Ich mache das jetzt aktuell noch als Hobby.


Anmelden zum Antworten