Dateiinhalt in Array kopieren
-
Hi,
ich suche nach einer Fktn. mit der ich int-Werte die in einer Datei stehn in ein dynamisch erzeugtes Array speichern kann.

Gruß steve
-
Tja dann schau mal bei Google mit den Stichworten "C++ Datei lesen".
-
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 arraysgruß 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 arraysgruß 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, umcountauf 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::vectoranbietet. 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());