Einlesen der Datei führt zu Crash



  • Hi, danke für eure Antworten, vorallem die Kritik am Stil, allerdings bringt mir die Kritik nichts, wenn ich keinen Grund dazu weiss 🙂

    Warum soll ich using nicht in header-Dateien verwenden?
    Warum soll ich keine Massen-includes in header-Dateien machen bzw nur da wo ich sie brauche?

    Und wie soll ich die Datei einlesen?
    Ich wollte nach diesem Beispiel hier gehen:
    http://www.cplusplus.com/reference/iostream/istream/read/

    Danke 🙂



  • Schön das du wenigstens versucht nach der Referenz zu programmieren.
    Read kann man nutzen,jedoch wenn du nicht gezwungen bist binär einzulesen, sondern wenn du die Daten in Roh vorliegen hast. Dann ist das einlesen in dieser Art und weiße meistens besser

    Ganze Zeilen einlesen, solange Dateiende nicht erreicht:

    #include<iostream>
    #include<fstream>
    #include<vector>
    #include<string>
    
    int main()
    {
       std::string temp;
       std::vector<std::string> dateiinhalt;
       std::ifstream input("deinedatei.txt");//ifstream ist zum lesen da
    
       while(getline(input,temp))
       {
           dateiinhalt.push_back(temp);
       }
    }
    

    Wortweises einlesen einer Datei:

    #include<iostream>
    #include<fstream>
    #include<vector>
    #include<string>
    
    int main()
    {
       std::string temp;
       std::vector<std::string> dateiinhalt;
       std::ifstream input("deinedatei.txt");//ifstream ist zum lesen da
    
       while(input>>temp)
       {
           dateiinhalt.push_back(temp);
       }
    }
    

    Man beachte die whiles, diese unterscheiden sich pro Version.



  • Allerdings fehlen dann bei beiden versionen die whitespaces, zumindest beim zweiteren ganz. Beim zeilenweise einlesen, fehlt ja \n bzw für Windows (trifft mich nicht) \r\n



  • Was fehlt da? Willst du \r\n entfernen oder was meinst du grad?



  • Nein, ich möchte auch gerne \n im Speicher haben 🙂 und das ist bei getline nicht vorhanden, oder?

    //edit: bzw. warum ist es nicht gut, die Datei binary zu lesen?


  • Administrator

    Lumio schrieb:

    Warum soll ich using nicht in header-Dateien verwenden?

    Weil du damit den Namespace aushebelst. Sobald du irgendwo das Headerfile inkludierst, ist auch dort die using-Anweisung drin. Dadurch läufst du Gefahr, irgendwann einen Namenskonflikt zu haben. Die using Anweisung kann man nicht wieder zurücksetzen.
    Auch wirst du dich entsprechend ärgern, wenn das Headerfile zu einer Bibliothek gehört, welche du benutzt. Denn dann hast du überhaupt keine Möglichkeit, dies zu verändern. Du wirst nur die Bibliothek und den Programmierer verfluchen können 😉

    Also die using-Anweisungen entweder in einen Scope rein, denn die Dinger sind auch Scope abhängig und nur in den globalen Scope, wenn du dich in einem Implementationfile befindest. Aber auch dort, würde ich aufpassen mit dem Zumüllen vom globalen Scope. Namespaces haben schliesslich ihre Berechtigung 😉

    Lumio schrieb:

    Warum soll ich keine Massen-includes in header-Dateien machen bzw nur da wo ich sie brauche?

    Weil du damit unnötige Abhängigkeiten machst. Gerade in IDEs gibt es die Möglichkeit, dass man nur die veränderten Sachen neu kompilieren muss. Wenn du nun ein Projekt hast, welches für einen kompletten Build 30 Minuten braucht (was nicht abnormal ist!), dann bist du froh, wenn du etwas in einem Header veränderst und nur der veränderte Teil neu kompiliert werden muss. Wenn du unnötige Abhängigkeiten geschaffen hast, dann muss alles neu kompiliert werden, jedesmal 😉

    Zudem müssen auch unnötige Headerfiles immer neu geparst werden. Dies kann sehr aufwendig sein und somit die Kompilezeit nochmals verlängern.

    Lumio schrieb:

    //edit: bzw. warum ist es nicht gut, die Datei binary zu lesen?

    Es kommt darauf an, was du genau machen willst. std::ios::binary garantiert, dass beim Lesen und Speichern die Daten nicht verändert werden. Das mag sinnvoll sein, wenn man wirklich mit binären Files arbeitet, also zum Beispiel einem JPEG. Was nämlich verändert wird, sind Dinge wie ein \n . Wenn du ein Linefeed ausgibst und auf einem Linux System bist, dann bleibt es bei einem Linefeed. Auf Windows wird aus dem Linefeed automatisch ein \r\n . Also es hat durchaus seine Vorteile, std::ios::binary nicht anzugeben, wenn man mit Textfiles arbeitet.

    Aber es bleibt halt dabei, es kommt darauf an, was man eigentlich möchte. Will man das File 1:1 kopieren, dann ist std::ios::binary durchaus angebracht.

    Übrigens, wurde eigentlich das Problem mit dem Crash nun behoben?

    Grüssli



  • Das mit dem Crash wurde indirekt gelöst. Also es wurde durch eine andere Art und weise gelöst. Dennoch wollte ich probieren, wie ich das ganze eben binär einlesen kann.

    Ich hab den Code unter http://www.cplusplus.com/reference/iostream/istream/read/ nocheinmal gelesen und probiert. Es klappt, wenn ich ihn eins zu eins in die main-Funktion schreibe.

    Wie gesagt, ich hab mir ein Ziel gesetzt, einen kleinen Parser zu basteln. Für das einlesen der Zeilen wird wohl std::ios::binary nicht wirklich benötigt.

    Aber welche anderen Arten gibt es noch? Ich weiss, dass es andere Arten gibt, allerdings fallen sie mir nicht ein 🙂

    Danke für eure Hilfe


  • Administrator

    Lumio schrieb:

    Aber welche anderen Arten gibt es noch? Ich weiss, dass es andere Arten gibt, allerdings fallen sie mir nicht ein 🙂

    Was verstehst du unter anderen Arten? Andere Arten von was? std::ios::binary ist ein Flag, welches man setzt oder nicht. Es gibt keine anderen Arten, es gibt höchstens andere Flags, aber keine, welche etwas in die Richtung von std::ios::binary machen.

    Grüssli



  • Ja stimmt... danke. 🙂 Welche Flags gibt es noch?


  • Administrator


Anmelden zum Antworten