Dateiinhalt in Array kopieren



  • Hab ich ja.
    Ich würde ja das getline() nehemen,aber das übergibt ja nur char-Werte.
    Brauche aber ja was, was int übergibt.
    gruß



  • std::ifstream reader("test.txt");
    std::vector<int> data;
    if(reader)
    {
        std::copy
            ( std::istream_iterator<int>(reader)
            , std::istream_iterator<int>()
            , std::back_inserter(data));
    
    }
    

    Benötigte Header:

    <fstream>
    <vector>
    <algorithm>
    <iterator>
    

    Um zu verstehen, was genau passiert, musst Du eine Suchmaschine Deiner Wahl bemühen.



  • Ich zähle zuerst die Zeilen in einer Datei.Dann erzeuge ich daraus ein dynamisches array(siehe code).Und dann will ich die werte die in der Datei stehn( 1 int-wert je zeile) im array speichern.
    Wollt eigentlich mein dynamisches array so erzeugen:

    //erzeugen eines dynamischen arrays, wobei count die anzahl der Zeilen ist
    int *feld = new int[count];
    

    Hab das ja so probiert wie es "Tachyon" vorgeschlagen hat.
    Wollte dann die vector elemente mit data[0];data[1] etc. ansprechen aber da brach das prog während der laufzeit ab....



  • WINFO2105 schrieb:

    Hab das ja so probiert wie es "Tachyon" vorgeschlagen hat.
    Wollte dann die vector elemente mit data[0];data[1] etc. ansprechen aber da brach das prog während der laufzeit ab....

    Dann war der Vektor wohl leer. Das bedeutet, dass irgendwas beim Einlesen schiefgegangen ist.
    So kannst Du prüfen, ob beim Einlesen alles gut geht:

    //Exceptions "aktivieren"
    reader.exceptions ( std::ifstream::eofbit | std::ifstream::failbit | std::ifstream::badbit );
    //...
    try
    {
        std::copy(//...
    }
    catch(std::ifstream::failure & e)
    {
        std::cerr << e.what() << '\n';
    }
    //...
    


  • Werd ich gleich ma probieren.
    Würde es aber nicht auch gehen,wenn ich getline() nehme und die char-werte in int konvertiere?
    gruß



  • WINFO2105 schrieb:

    Werd ich gleich ma probieren.
    Würde es aber nicht auch gehen,wenn ich getline() nehme und die char-werte in int konvertiere?
    gruß

    Warum solltest Du das tun? Der Stream wandelt die Werte ja schon automatisch für Dich nach int um.



  • Na wenn ich das mit Vector und dem Stream mache ist mir das ja klar das es in Int umgewandelt wird.
    Aber wenn ich es mit diesem code erzeuge und dann mit getline() auslese und
    die werte mit ner FOR-Schleife in das array speichere?

    int *feld=new int[count]; //count ist anzahl der zeilen in datei->größe des arrays
    

    gruß steve



  • WINFO2105 schrieb:

    Na wenn ich das mit Vector und dem Stream mache ist mir das ja klar das es in Int umgewandelt wird.
    Aber wenn ich es mit diesem code erzeuge und dann mit getline() auslese und
    die werte mit ner FOR-Schleife in das array speichere?

    int *feld=new int[count]; //count ist anzahl der zeilen in datei->größe des arrays
    

    gruß steve

    Und wie bekommst Du die Strings, die Dir getline liefert in Integer-Werte konvertiert?
    Da bräuchtest Du eine stringstream für, der genau das gleiche macht, wie der ifstream es schon selbst ganz direkt macht.
    Und weisst Du denn, was Du machen musst, um count auf den richtigen Wert zu setzen?



  • ach mist stimmt......
    stell jetzt ma dn kompletten code rewin damit man das mal nachvollziehen kann:

    #include "stdafx.h"
    #include <fstream>
    #include <iostream>
    #include <string>
    
    using namespace System;
    using namespace std;
    
    int main(array<System::String ^> ^args)
    {
    
    ifstream quelle;
    string quelldateiname;
    cout << "Quelldatei?...(Kompletten Pfad angeben!!)"<<endl;
    cin >> quelldateiname;
    
    quelle.open(quelldateiname.c_str(), ios::in);
    
    if(!quelle)
    	{
    	cerr << quelldateiname << "kann nicht geoeffnet werden!" <<endl;
    	exit(-1);
    	}
    
    cout << "Name der zu erstellenden Zieldatei?..."<<endl;
    string zieldateiname;
    cin >> zieldateiname;
    ofstream ziel(zieldateiname.c_str(),ios_base::out|ios_base::in|ios_base::app);
    
    if(!ziel)
    	{
    	cerr << zieldateiname <<"kann nicht geoeffnet werden!"<<endl;
    	exit(-1);
    	}
    
    //Hilfsvariablen(zähler,hilfspuffer)
    int count=0;
    string text;
    //while schleife die zeilen in datei zählt
    while(getline(quelle,text))
    	{
    
    	 count++; 
    
    	}
    
    //erzeugen eines dynamischen arrays
    int *feld = new int[count];
    
    //füllen des arrays mit werten aus zeilen
    for(int i =0; i<=count ;i++)
    	{
    	feld[i] =     //!!! hier fehlts halt !!!
    	}
    
    cout << "Array mit der Groeße"<<count<<"wurde erstellt"<<endl;
    cout << "Array Daten:"<<endl;
    cout << feld[0]<<endl;
    cout << feld[1]<<endl;
    cout << feld[2]<<endl;
    cout << feld[3]<<endl;
    cout << feld[4]<<endl;
    
    quelle.close();
    ziel.close();
    }
    

    Vielleicht ist das Verständnis jetzt besser....
    MFG



  • Also ich würde kein ekliges dynamisches C-Array benutzen, wenn C++ std::vector anbietet. Du progammierst schließlich C++ und nicht C. Also solltest Du auch C++ benutzen.
    Zeile 37 bis 57 duch folgendes ersetzen:

    std::vector<int> feld;
    int value;
    while(quelle >> value)
    {
        feld.push_back(value);
    }
    

    Der Rest bleibt wie Du es hast.
    Ist doch viel einfacher als das ganze Getrödel mit count usw.



  • Bombe......
    Funzt alles super.
    Kannte das mit dem Vector zwar aber wusste nicht so richtig wie ich es einsetzte 🙄
    Ist auf den ersten Blick auf jeden Fall besser als ein "standard" dynamisches Array zu erzeugen -> Performance und Codeersparnis....
    Werd jetzt noch ein sortieralgorythmus reinbasteln, aber das sollte eigentlich ohne weitere gehen, da man die vector-elemente genau so wie array-elemente ansprechen kann...
    und zur not gibts ja das forum hier 😃
    MFG steve



  • Wenn es dir nicht um den Lerneffekt, sondern die Anwendung effizienter Sortieralgorithmen geht, kannst du std::sort() oder je nachdem auch std::stable_sort() benutzen.

    std::vector<int> Vec; // füllen
    std::sort(Vec.begin(), Vec.end());
    

Anmelden zum Antworten