Zeilenweise .txt lesen und in Array speichern



  • Hallo,

    ich habe eine .txt Datei, in der 3 Zahlen, in jeder Zeile eine stehen.

    Nun möchte ich, dass diese Datei gelesen wird und jede Zeile in ein Array gespeichert wird. Kleines Besispiel:

    Txt-Datei:

    123
    666
    911

    int array[3]
    
    //Hier wird das Array mit den Zahlen gefüllt, sodass dann
    
    array[0] = 123
    array [1] = 666
    array [2] = 911
    
    //das Array am Ende also so aussieht...
    

    Habe gehört, es funktioniert irgendwie mit der getline(); Funktion eines ofstream Objektes, aber so ganz verstehe ich diese Funktion nicht.

    Kann mit bitte jemand anfängerfreundlich eine möglichst einfache Lösung nennen?

    Vielen Dank schonmal,

    Erik



  • Für array nutze am besten std::array

    meine Empfehlung und vermutlich auch die vieler Anderer, nutze vector:

    #include <fstream>
    #include <vector>
    
    int main()
    {
        std::ifstream ist("<dein Pfad>");
        std::vector<std::string> zeilen;
        std::string zeile;
        while(std::getline(ist, zeile))
            zeilen.push_back(zeile);
    }
    

    Wenns gleich integer sein sollen, würde ich machen

    std::vector<int> numbers;
    int num {0};
    while(ist >> num) numbers.push_back(num);
    

    mfg


  • Mod

    meine Empfehlung und vermutlich auch die vieler Anderer, nutze vector:

    Die Anzahl der Zahlen steht zur Compile-Zeit fest und ist ziemlich klein, also macht es Sinn, ein Stackarray zu verwenden:

    std::ifstream stream{"Pfad.txt"};
    std::array<int, 3> arr;
    stream >> arr[0] >> arr[1] >> arr[2];
    

    Falls die Datei keine feste Größe hat, sondern im Prinzip eine beliebige haben kann, dann kann man

    std::ifstream stream{"Pfad.txt"};
    std::vector<int> numbers{ std::istream_iterator<int>{stream}, std::istream_iterator<int>{} };
    

    schreiben.



  • Arcoth schrieb:

    std::ifstream stream{"Pfad.txt"};
    std::vector<int> numbers{ std::istream_iterator<int>{stream}, std::istream_iterator<int>{} };
    

    schreiben.

    Bitte nicht die uniform initialization verwenden! Die macht hier semantisch keinen Sinn (ausser bei den Iteratoren) und ist wird gerade bei vector sehr leicht gefährlich.



  • oggnö schrieb:

    Bitte nicht die uniform initialization verwenden! Die macht hier semantisch keinen Sinn (ausser bei den Iteratoren) und ist wird gerade bei vector sehr leicht gefährlich.

    Erklär das mal genauer. In welcher Situation sind uniform initializers schlecht?



  • Uniform Initialization ist allgemein Scheisse und gehoert in allen Coderichtlinien verbannt.



  • nwp3 schrieb:

    oggnö schrieb:

    Bitte nicht die uniform initialization verwenden! Die macht hier semantisch keinen Sinn (ausser bei den Iteratoren) und ist wird gerade bei vector sehr leicht gefährlich.

    Erklär das mal genauer. In welcher Situation sind uniform initializers schlecht?

    Erstelle ich mir doch mal einen vector mit 5 Elementen:

    std::vector<int> vec{5];
    

    Ups.

    Ich persönlich meide uniform list initialization und verwende sie nie.



  • nwp3 schrieb:

    In welcher Situation sind uniform initializers schlecht?

    Sie sind ein gescheiterter Versuch, die nicht-einheitliche Syntax auf einen gemeinsamen Nenner zu bringen. Der Anspruch auf Einheitlichkeit blieb nicht nur unerfüllt, sondern war meines Erachtens ein fundamentaler Fehler, weil durch den Versuch, alles zu erlauben, erst derartige Mehrdeutigkeiten möglich wurden.

    Meiner Meinung nach wäre es sinnvoll gewesen, diese Syntax für Initializer-Lists zu verwenden und nur dafür. Aber man wollte es natürlich jedem Recht machen 🙄

    Siehe auch hier.


  • Mod

    Edit: Gegen Nexus will ich nicht wieder argumentieren.



  • Man sollte es halt dort verwenden, wo es sinnvoll ist. Ist ja schon nicht schlecht, wenn ich mein intialisieren einer Variable gewarnt werde, wenn ich aus 3.75 3 mache...



  • hardware schrieb:

    Man sollte es halt dort verwenden, wo es sinnvoll ist. Ist ja schon nicht schlecht, wenn ich mein intialisieren einer Variable gewarnt werde, wenn ich aus 3.75 3 mache...

    Erstens solltest du da auto verwenden, zweitens ist das ein Non-Issue:

    warning: implicit conversion from 'double' to 'int' changes value
          from 3.75 to 3 [-Wliteral-conversion]
      int i = 3.75;
          ~   ^~~~
    

Log in to reply