Datenzugriff auf externe Datei
-
Hallo Leute,
ich bin noch Neuling auf dem Gebiet der c++ Sprache, daher kann es auch vorkommen, dass meine Fragen etwas banal wirken. Ich bitte daher um ein wenig Nachsicht.
Nun zur eigentlichen Frage:
Mein Programm soll seine Variablen aus einer externen Textdatei beziehen, in der Zahlen hinterlegt sind.
Wie kann ich so einen Zugriff realisieren?Danke im Voraus
-
Die einfachste Lösung ist die Verwendung von File-Streams:
#include <fstream> #include <vector> //#include <iterator> using namespace std; fstream data("mydata.txt"); vector<int> data_intern; //Einlesen: copy(istream_iterator<int>(data),istream_iterator<int>(),back_inserter(data_intern)); //Zugriff mittels data_intern[i]; //Zurückschreiben: copy(data_intern.begin(),data_intern.end(),ostream_iterator<int>(data));
-
Danke für die schnelle Antwort!
Könntest du bitte einem "Dummie" den Quelltext bitte etwas näher erläutern?Ich hoffe jeder von euch weiss noch wie das war als er angefangen hat zu programmieren...man ist froh um jede Hilfe.
Danke
-
fangen wir mit den Grundlagen an:
* fstream dient zur Kommunikation mit anderen Dateien (der Konstruktor bekommt den Dateinamen und evt. die Zugriffsart - müßtest du notfalls ergänzen, falls das Programm so rumspinnt).
* vector ist ein Container, in dem du sequentiell Daten ablegen kannst (edit: ähnlich einem Array, aber der kann seine Größe bei Bedarf anpassen).
* Iteratoren sind eine Abstraktion von Pointern, um auf dem Inhalt von Containern und ähnlichen Konstrukten operieren zu können, ohne sich um die technischen Details zu kümmern (istream_iterator liest vom zugeordneten Stream, ostream_iterator schreibt auf den Stream, back_inserter schreibt ans Ende eines Containers).
* copy() ist ein Algorithmus, der Daten von A nach B verschieben kann (die Parameter sind: Anfang von A, Ende von A und Anfang von B - jeweils als Iterator)-> Zusammengefasst:
* der erste copy()-Aufruf liest deine übergebene Datei komplett ein und packt die Zahlen in den Vektor
* der zweite copy()-Aufruf schreibt den Vektor sequentiell in die Dateiim Vektor kannst du mit data_intern[i] auf das i-te Element (von 0 beginnend) zugreifen, um es zu lesen oder zu verändern
-
Hallo,
also ich hab das mal mit dem Quelltext von dir probiert, aber mein Compiler bringt mir lauter Fehler.
Der Daten die mit dem Importieren geladen werden sollen alle an unterschiedliche int und floats zugeordnet werden.Danke!
-
Ah so, sag das doch gleich:
fstream data("mydata.txt"); data >> var1 >> var2 >> var3 ...; //oder: if(!(data>>var1)){cout << "var1 defekt" << endl; exit(1);} if(!(data>>var2)){cout << "var2 defekt" << endl; exit(1);} ...(der Operator >> sucht sich jeweils den nächsten Zahlenwert aus der Datei (und parst ihn gleich richtig nach int bzw. float je nach Typ der angegebenen Variable), in der zweiten Variante wird nach jeder Eingabe überprüft, ob die Daten in Ordnung waren (der if-Teil wird angesprungen, wenn z.B. zu wenig Daten vorlagen oder ein Buchstabe dazwischengerutscht ist).
-
okay,
ich glaube das ist das was ich suche,
aber wie weiss das programm welcher variable die zahl zugewiesen werden kann?
muss ich im externen file die zahl dann so schreiben:
a=5
?
oder kann ich auch nur
5
schreiben?
-
Dazu legst du am besten die Reihenfolge fest, in der die Variablen gespeichert werden sollen (die Datei wird sequentiell gelesen). Die Variante "a=5" ist auch möglich, aber dann ist die Zuordnung zu den Variablen komplizierter.
-
So sieht mein Code bisher aus (ist nur ein Test):
#include <iostream.h>
#include <fstream.h>fstream data("mydata.txt");
int main()
{
int a, b, c;data >> a >> b >> c ;
cout << a;
cout << b;cin >>c;
return 0;
}Der Compiler medet aber:
main.cpp(4) : error C2664: 'fstream::fstream(int)' : Konvertierung des Parameters 1 von 'char [11]' in 'int' nicht moeglich
und das mydata.txt file sieht so aus
50
30
120
-
catachanfighter schrieb:
main.cpp(4) : error C2664: 'fstream::fstream(int)' : Konvertierung des Parameters 1 von 'char [11]' in 'int' nicht moeglich
*grübelt* Ich wußte gar nicht, daß fstream einen int-Konstruktor hat.
*länger nachdenkt* setz' mal ein "using namespace std;" hinter die Includes (oder ein "std::" vor fstream).
-
bzw. schau einfach in die FAQ
-
so leute,
ich hab nen neuen Versuch gestartet und der sieht wie folgt aus.
#include <iostream.h>
#include <fstream.h>
main ()
{
int x;
char zeile[100];
fstream variablen ("mydata", ios::in);
if (!variablen)
{
cout<< "keine Datei vorhanden!";
return 3;
}
else
{
variablen.getline(zeile, 1);
cout << zeile;
cin >> x;
}
variablen.close();
return 0;
}Leider greift er weder auf die Zeile im File zu, noch bringt er den Fehler, wenn die Datei gar nicht existiert.
Was mache ich flasch?Danke und Gruß
-
getline() erwartet als zweiten Parameter die Größe des Eingabpuffers - du liest also in der aktuellen Version nur ein Zeichen ein. Ansonsten scheint immer noch die namespace-Angabe zu fehlen.
-
@catachanfighter
Hast du dir den angegebenen Link zur FAQ wirklich durchgelesen? Da ist das alles erklärt.
-
@braunstein
ich habe den Link durchgelesen.
aber wie ich bereits oben erwähnt habe bin ich noch Anfänger in c++. Mir ist auch schon sehr oft aufgefallen, dass solche Arten von Lösungen (weiterleiten eines schon bestehenden Quelltextes) pädagogisch nicht besonders hochwertig sind. Das Problem liegt einfach darin, dass jeder Programmierer einen eigenen Stil hat seine Programme zu erstellen und auch die Handhabe der verschiedenen Funktionen variiert sehr. Damit tun sich sehr viele "Newies" schwer. Darum ist es doch oft sinnvoller dem Fragendem seinen Quelltext zu ergänzen oder zu korrigieren.
Das FAQ beschreibt wie ich entweder Strings in einen Vektor einlade oder aus Binärdateien lese...hat irgendwie beides nichts mit meinem Problem zu tun. Natürlich kommt jetzt gleich wieder die Aussage, ich soll diese Beispiele auf mein Problem zuschneiden und abändern. Aber genau das hab ich doch gemacht und es funktioniert eben leider nicht. Darum meine erneute Anfrage.
Des weiteren habe ich auch die in diesem Threat vorgeschlagenen Quelltexte verwendet aber wie bereits erwähnt brachte kein Beispiel überhaupt ein compilierbares Ergebnis mit sich.Gruß
-
Du kannst alles was in der FAQ steht so auf dein Problem anwenden.
Mal als Beispiel#include <iostream> // ohne .h #include <ifstream> //ohne .h #include <string> // für string using namespace std; //Namensraum std öffnen int main () //Kosmetik { int x; string zeile; // statt char zeile[100]; ifstream variablen ("mydata"); // bei ifstream kann ios::in entfallen if (!variablen) { cout<< "keine Datei vorhanden!"; return 3; } else { getline(variablen,zeile); // zeile einlesen
-
Also ich hab den Quelltext genommen und zu mir ins programm kopiert.
aber er beklagt sich (wie bei allen anderen Beispielen auch) über die Zeileusing namespace std; //Namensraum std öffnen
und zwar folgendermaßen
main.cpp(27) : error C2871: 'std' : Existiert nicht oder ist kein Namensraum
des weiteren gibt es noch fünf andere Errors die gemeldet werden.
ergänzt wurde der quelltext nur um folgende zeilencout << zeile;
}
return 0;
}
-
hi catafighter,
ich kann dich nur zu gut verstehen da ich selber noch in den grünen Stiefeln
stehe (in bezug auf C++)
Du willst also wissen wie man aus einer externen Textdatei einen Wert nimmt und den der Variable in deiner .cpp Datei zuweist.
Ich könnte dir so auf anhieb nicht weiterhelfen - wegen den grünen Stiefel -
aber wenn du mir deine eMail adresse gibst könnte ich dir ein sehr gutes Tutorial zu diesem Thema schicken.
Ich habe das tut noch nicht ganz durchgearbeitet aber so wie das bis jetzt aussieht gibt es gerade in C++ eine sehr komfortable und einfache Lösung deines Problems.
Der Autor macht es irgendwie einfach mit cin und cout.... aber wie gesagt ich habs noch nicht ganz durch und auch noch nicht verstanden.
Aber wenn Interesse besteht- dann kein prob.#include < schöneGrüße >
-
Hallo socco,
häng einfach an meinen nick ein @gmx.de
Danke vielmals!
Gruß
-
Und wenn es nicht mit getline funktionieren sollte, gibt es auch noch eine andere, nicht aber schönere Möglichkeit den Text auszulesen:
##pragma argsused #include <iostream> #include <fstream> #include <conio.h> using namespace std; int main(int argc, char* argv[]) { string zeichen; ifstream DataRead ("test.txt"); if (!DataRead) { cout << "Keine Datei vorhanden!"; return 0; } else { while (!DataRead.eof()) // Wenn das Dateiende nicht erreicht ist { zeichen = DataRead.get(); // Zeichenweise ein Zeichen in den cout << zeichen; // String schreiben } } DataRead.close(); getch(); return 0; }