Datei lesen und in array speichern



  • Gutan Tag,

    mein Problem sieht läßt sich so schildern:ahl

    in einer Textdatei stehen Zahlen, getrennt durch eine unterschiedliche Anzahl von Leerzeichen und durch das Zeilenende an sich.

    20 55 66  843    45    998666   4       334   667    68       778
    45454 44 2234234 233222
    

    Nun möchte ich die Zahlen statt in einem string-Array zu speichern in einem integer array speichern.
    Dabei gibt die erste zahl (zahl im Feld 0 des buffers) die größe des zu erstellenden Int-Arrays( beispielsweise '20') an.

    bisher:

    - erste Zeile mit getline ausgelesen
    - leerzeichen entfernt
    - Zahlen wurden als Strings in ein Array gebuffert

    im Feld 0 des buffers liegt als String die zahl ('20')

    buch.field[0]  // hier liegt die zahl 20
    

    Wie gelingt es mir nun ein Array mit der Größe des Inhaltes von buch.field[0] zu erstellen?

    Bisher habe ich folgendes versucht:

    int laenge = static_cast<int>(buch.field[0]); 
    int iarray[laenge];
    

    das ging zum einen schief da mit static_cast er Probleme hatte den string in einen Integer umzuwandeln. Und zum anderen die initialisierung des Arrays währed der Laufzeit.
    [/code]
    :xmas1:



  • Hallo,

    Schau mal in die FAQ.
    String in Zahl umwandeln
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
    Das darauffolgende Array mußt du dynamisch erstellen

    int* iarray = new int[laenge];
    // delete[] nicht vergessen
    

    Besser ist es du nimmst gleich std::vector (siehe Magazin).



  • hmm am einfachsten so:

    std::ifstream file_stream("data.dat");
    if (!file_stream) throw std::runtime_error("could not open file!");
    std::size_t data_count(0);
    if (!(file_stream >> data_count)) throw std::runtime_error("invalid file");
    std::vector<int> vec_data(data_count);
    std::copy(std::istream_iterator<int>(file_stream), std::istream_iterator<int>(), vec_data.begin());
    

    ... in vec_data sollte danach stehen, was du haben willst.



  • Noch eine kleiner patch um die Länge des Integerfeldes zu bekommen

    int* iarray = new int[strlen(iarray)+1];
    // delete[] nicht vergessen



  • AJA schrieb:

    Noch eine kleiner patch um die Länge des Integerfeldes zu bekommen

    int* iarray = new int[strlen(iarray)+1];
    // delete[] nicht vergessen

    Und was soll das bringen - außer undefiniertem Verhalten? Du rufst strlen() mit einem (noch) nicht initialisierten Zeiger auf und nutzt dann dessen Ergebnis, um eben diesen Zeiger zu initialisieren.


Anmelden zum Antworten