Einlesen von Daten

Schnelle objektorientierte, kompilierende Programmiersprache.
gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Einlesen von Daten

Beitrag von gamma » Do Nov 10, 2016 11:44 pm

Hallo....
Ich habe ein Programm geschrieben das mir das Kreuzprodukt, Skalarprodukt, Addition von 2 Vektoren und das Produkt von einer Matrix mit einem Vektor berechnet. Ich lese das im Moment alle über die Konsole ein aber ich würde das gerne ändern. Ich möchte die Werte jetzt aus einer Datei einlesen und die Ergebnisse in eine andere Datei speichern. Zumindest das öffnen der Datei klappt. Mein Programm sieht im Moment folgendermaßen aus:

Code: Alles auswählen

#include<iostream>

#include<cmath>

#include<vector>

#include"header.hpp"

#include<fstream>
using namespace std;













int main()

{


	ifstream einlesen ("Zahlen.dat");
	if (einlesen)
	
	cout<<"Daten wurden eingelesen"<<endl;
	
	else
	{
	cout<<"Konnte Daten nicht einlesen"<<endl;
	return 99;
	}
	
	double a;
	int n{0};
	while ( einlesen >>a>>a>>a>>a>>a>>a>>a) n++;
	einlesen.clear();
	einlesen.seekg(0, ios_base::beg);
	vector<double> vecein(n), vecein1(n),Matrixein(n);
	for (a = 0;a<n;a++);
	{
	einlesen>>vecein.at(a);
	einlesen>>vecein1.at(a);
	einlesen>>Matrixein.at(a);
	}
	
	
	

	double Matrix1[9];	
	double x,y,z,x_1,x_2,x_3;

	vector<double> vec(3);

	vector<double> vec1(3);

	cout<<"Geben Sie die x Koordinaten ein:"<<endl;

	cin>>vec[0];

	cin>>vec1[0];

	cout<<"Geben Sie die y Koordinaten ein:"<<endl;

	cin>>vec[1];

	cin>>vec1[1];

	cout<<"Geben Sie die z Koordinaten ein:"<<endl;

	cin>>vec[2];

	cin>>vec1[2];

	cout<<"Geben Sie eine Matrix ein"<<endl;
	cin>>Matrix1[0]>>Matrix1[1]>>Matrix1[2]>>Matrix1[3]>>Matrix1[4]>>Matrix1[5]>>Matrix1[6]>>Matrix1[7]>>Matrix1[8];
	cout<<"Vektor1:<"<<vec[0]<<","<<vec[1]<<","<<vec[2]<<">"<<endl;

	cout<<"Vektor2:<"<<vec1[0]<<","<<vec1[1]<<","<<vec1[2]<<">"<<endl;

	vector<double> Addition(3);

	Addition = Vektoraddition(vec,vec1);

	cout<<"Addition:"<<"<"<<Addition[0]<<","<<Addition[1]<<","<<Addition[2]<<">"<<endl;

	double Skalarprodukt;

	Skalarprodukt = Skalarpr(vec,vec1);

	cout<<"Skalarprodukt:"<<Skalarprodukt<<endl;

	vector<double> kreuzprodukt(3);

	kreuzprodukt = Kreuzprodukt (vec,vec1);

	cout<<"Kreuzprodukt:"<<"<"<<kreuzprodukt[0]<<","<<kreuzprodukt[1]<<","<<kreuzprodukt[2]<<">"<<endl;
	vector<double> MatrixVektor(3);
	MatrixVektor = Matrix_vektor (Matrix1, vec);
	cout<<"Matrix*Vektor:"<<"<"<<MatrixVektor[0]<<","<<MatrixVektor[1]<<","<<MatrixVektor[2]<<">"<<endl;


	
	ofstream ausgabe ("Ausgabe.dat");
	for (int i = 0; i < a; i++)
	{
		ausgabe << "(" << vecein[i] << "," << vecein1[i] << "," << Matrixein[i]<<")" << endl;
	}

return 0;

}
Es lässt sich zwar kompelieren, ich bekomme aber wenn ich es ausführen möchte: " Vektorrechnung funktioniert nicht mehr" zurück.
Im Moment lass ich ja nur einmal die Daten einlesen und überschreibe sie dann genauso wieder. Kann mir wer sagen wo mein Fehler liegt und wie ich den beheben kann. Außerdem rätsel ich noch wie ich in weiterer Folge meine ersten 3 Zahlenwerte den 1. und die anderen den 2 Vektor zuordnen kann.
Ich hoffe ihr könnt mir helfen.
Schon mal danke!

Benutzeravatar
Necip
Beiträge: 122
Registriert: Do Nov 17, 2011 12:03 pm
Kontaktdaten:

Re: Einlesen von Daten

Beitrag von Necip » Fr Nov 11, 2016 9:45 am

Am Programm musst Du nichts ändern!

Schreibe Deine Eingabedaten in eine Datei
und rufe Dein Programm in einem DOS-Fenster folgendermaßen auf:

c:> dein.exe < input.dat > output.dat

Die Symoble < und > zeigen an in welche Richtung die Daten fließen sollen.

Das Programm "dein.exe" bekommt die Daten aus "input.dat" und schreibt sie in "output.dat"
Das machen die cin und cout Routinen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einlesen von Daten

Beitrag von Xin » Fr Nov 11, 2016 2:13 pm

gamma hat geschrieben:Es lässt sich zwar kompelieren, ich bekomme aber wenn ich es ausführen möchte: " Vektorrechnung funktioniert nicht mehr" zurück.
Es fliegt Dir also um die Ohren.
gamma hat geschrieben:Im Moment lass ich ja nur einmal die Daten einlesen und überschreibe sie dann genauso wieder. Kann mir wer sagen wo mein Fehler liegt und wie ich den beheben kann.
Ähh... nein. Dafür müsste man Dein Programm nachvollziehen können und wir können es vielleicht kompilieren, aber wir haben die Testdaten ja nicht. Und zu erraten, bei welchen Testdaten vielleicht was passiert... ich denke, da bist erstmal noch Du gefragt, mehr Informationen zu liefern.

Womit programmierst Du? In welcher Zeile stürzt Dein Programm ab?
Im Notfall packst Du da printfs in das Programm rein, immer eine steigende Zahl ausgeben und Du guckst, welche Zahl zuletzt ausgegeben wurde. Dahinter knallt's offenbar.
gamma hat geschrieben:Außerdem rätsel ich noch wie ich in weiterer Folge meine ersten 3 Zahlenwerte den 1. und die anderen den 2 Vektor zuordnen kann.
Wiederholende Tätigkeit? Schleife! :)
Mehrere Dinge verwalten? Vector.
Also machst Du eine Schleife über einen Vector von mehreren Vectoren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Re: Einlesen von Daten

Beitrag von gamma » Fr Nov 11, 2016 11:59 pm

Hmm das habe ich jetzt gemacht, ich bekomme allerdings keine Daten überschrieben. Es wird zwar erkannt das sich in der Datei auf die ich die Daten schreiben möchte etwas geändert hat, wenn ich dann allerdings auf aktualisieren klicke ist das Dokument immer noch leer.
Die Daten die ich einlesen möchte sind alles Zahlen in der Form: 1 2 3 4 5 6 7 8 9.... also insgesamt 15 Zahlen.
Könnt ihr vielleicht mit mir gemeinsam das einlesen und umschreiben durchgehen?
Mit ifstream("...") kann ich die Daten von der Datei ... einlesen. Die Schleife ob es geklappt hat verstehe ich auch. Die while Schleife ist mir nur nicht ganz klar! Ich muss mir eine Variable deklarieren auf die ich die Daten vorerst speichern kann (a) und n was immer weiter geht. Das geht solange bis alle Daten überschrieben wurden und die Fehlermeldung die dann kommen würde behebe ich mit einlesen.clear();. Was macht aber seekg(...)? Warum muss ich im nächsten Schritt Vektoren festlegen auf die ich dann wieder die Daten überschreibe?
Hoffe ich hab euch genug Informationen gegeben das ihr mir helfen könnt.
Danke auf alle Fälle!

Benutzeravatar
Necip
Beiträge: 122
Registriert: Do Nov 17, 2011 12:03 pm
Kontaktdaten:

Re: Einlesen von Daten

Beitrag von Necip » Sa Nov 12, 2016 8:59 am

How to redirect cin and cout: link

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einlesen von Daten

Beitrag von Xin » Sa Nov 12, 2016 10:30 am

gamma hat geschrieben:Könnt ihr vielleicht mit mir gemeinsam das einlesen und umschreiben durchgehen?
Mit ifstream("...") kann ich die Daten von der Datei ... einlesen. Die Schleife ob es geklappt hat verstehe ich auch. Die while Schleife ist mir nur nicht ganz klar!
Sollen wir aus der Erklärung erkennen, wie Dein Quelltext nun aussieht?

Das folgende ist nicht böse gemeint, aber wer eine Frage stellt - besonders schriftlich - muss dafür sorgen, dass er alle Vorarbeiten geleistet hat, die es dem Antwortgeber ermöglicht und erleichtert, die Frage zu beantworten.
Ich werde hier nicht anfangen mir die Änderungen im Quelltext zusammen zu phantasieren, um daran mögliche Fehler aufzuzählen. Ich werde auch nicht 50x mal nachfragen.
Pack alles auf's Tableau und ich werde mich um eine Antwort bemühen.
gamma hat geschrieben:Ich muss mir eine Variable deklarieren auf die ich die Daten vorerst speichern kann (a) und n was immer weiter geht. Das geht solange bis alle Daten überschrieben wurden und die Fehlermeldung die dann kommen würde behebe ich mit einlesen.clear();. Was macht aber seekg(...)? Warum muss ich im nächsten Schritt Vektoren festlegen auf die ich dann wieder die Daten überschreibe?
Ich verstehe die Frage nichtmals.

Quelltext. Und da will ich einen Kommentar "// nächster Schritt", damit ich überhaupt nachvollziehen kann, wovon Du sprichst. Woher soll ich wissen, was Du im geänderten Quelltext da tust!?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Re: Einlesen von Daten

Beitrag von gamma » Sa Nov 12, 2016 11:55 am

Also ich habe jetzt einmal meinen Code mit Kommentaren versehen was ich genau mache:

Code: Alles auswählen

#include<iostream>

#include<cmath>

#include<vector>

#include"header.hpp"

#include<fstream>

using namespace std;













int main()

{



	ifstream einlesen ("Zahlen.dat"); // Funktion "einlesen" soll die Daten aus der Datei Zahlen.dat einlesen.

	if (einlesen)//Schleife zum kontrollieren ob eingelesen wurde

	

	cout<<"Daten wurden eingelesen"<<endl;

	

	else

	{

	cout<<"Konnte Daten nicht einlesen"<<endl;

	return 99;

	}

	

	double a;//Variable auf die die Daten vorrübergehen geschrieben werden

	int n{0};//Laufvariable

	while ( einlesen >>a>>a>>a>>a>>a>>a>>a) n++;//System soll die Daten der Form 1 2 3... auf a schreiben.

	einlesen.clear();//Stopt die Schleife nachdem eine Fehlermeldung aufgetreten ist.

	einlesen.seekg(0, ios_base::beg);// ???

	vector<double> vecein(n), vecein1(n),Matrixein(n);//Definieren von Vektoren, um mit den Daten rechnen zu können

	for (a = 0;a<n;a++);// Schleife welche Werte auf Vektoren überträgt.

	{

	einlesen>>vecein.at(a);

	einlesen>>vecein1.at(a);

	einlesen>>Matrixein.at(a);

	}

	

	//Beginn des ursprpünglichen Programms, welches Daten aus der Konsole einließt(hat funktioniert)

	

	double Matrix1[9];	//definieren meiner 3x3 Matrix als Array

	double x,y,z,x_1,x_2,x_3; // Koordinaten der Vektoren

	vector<double> vec(3);	//Vektor1	

	vector<double> vec1(3); //Vektor2

	/*cout<<"Geben Sie die x Koordinaten ein:"<<endl;

	cin>>vec[0];

	cin>>vec1[0];

	cout<<"Geben Sie die y Koordinaten ein:"<<endl;

	cin>>vec[1];

	cin>>vec1[1];

	cout<<"Geben Sie die z Koordinaten ein:"<<endl;

	cin>>vec[2];

	cin>>vec1[2];

	cout<<"Geben Sie eine Matrix ein"<<endl;

	cin>>Matrix1[0]>>Matrix1[1]>>Matrix1[2]>>Matrix1[3]>>Matrix1[4]>>Matrix1[5]>>Matrix1[6]>>Matrix1[7]>>Matrix1[8];

	cout<<"Vektor1:<"<<vec[0]<<","<<vec[1]<<","<<vec[2]<<">"<<endl;

	cout<<"Vektor2:<"<<vec1[0]<<","<<vec1[1]<<","<<vec1[2]<<">"<<endl;

	vector<double> Addition(3);

	Addition = Vektoraddition(vec,vec1);

	cout<<"Addition:"<<"<"<<Addition[0]<<","<<Addition[1]<<","<<Addition[2]<<">"<<endl;

	double Skalarprodukt;

	Skalarprodukt = Skalarpr(vec,vec1);

	cout<<"Skalarprodukt:"<<Skalarprodukt<<endl;

	vector<double> kreuzprodukt(3);

	kreuzprodukt = Kreuzprodukt (vec,vec1);

	cout<<"Kreuzprodukt:"<<"<"<<kreuzprodukt[0]<<","<<kreuzprodukt[1]<<","<<kreuzprodukt[2]<<">"<<endl;

	vector<double> MatrixVektor(3);

	MatrixVektor = Matrix_vektor (Matrix1, vec);

	cout<<"Matrix*Vektor:"<<"<"<<MatrixVektor[0]<<","<<MatrixVektor[1]<<","<<MatrixVektor[2]<<">"<<endl;*/



	

	ofstream ausgabe ("Ausgabe.dat");// Übertragen der Daten auf die Datei Ausgabe.dat( Datei wird zwar verändert, ist aber nachher immer noch leer)

	for (int i = 0; i < a; i++) //Schleife zum übertragen der Daten

	{

		ausgabe << "(" << vecein[i] << "," << vecein1[i] << "," << Matrixein[i]<<")" << endl;

	}



return 0;

}
Was einlesen.seekg(0, ios_base::beg) macht weiß ich leider nicht genau. Ich habe das mit Hilfe des Vo Skripts und alten Beispielen gemacht und verstehe daher leider selber nicht jeden Schritt. Der code für die Berechnungen der addition usw hab ich separat gespeichert, aber der dürfte passen, da das Programm ja schon gelaufen ist als ich die Daten von der Konsole eingelesen habe.
Ich möchte jetzt nur einmal die Daten Zahlen.dat einlesen und auf Ausgabe speichern.
Das folgende ist nicht böse gemeint
Ist auch nicht böse rüber gekommen aber ich hoffe es passt jetzt soweit alles!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einlesen von Daten

Beitrag von Xin » So Nov 13, 2016 4:00 pm

gamma hat geschrieben:Also ich habe jetzt einmal meinen Code mit Kommentaren versehen was ich genau mache:

Code: Alles auswählen

	int n{0};//Laufvariable
Kommentiere nicht das offensichtliche, pack Dir einen Block zusammen und schreib drüber, was er tut.
Wird der Block zu groß, mach eine Funktion draus, deren Funktionsname dokumentiert, was hier getan wird.

Code: Alles auswählen

	einlesen.seekg(0, ios_base::beg);// ???
Er springt an den Anfang der Datei zurück und liest die Daten dann nochmal ein.

Es folgt ein laaaaanger Kommentar. Den brauchen wir hier wohl nicht.
gamma hat geschrieben: Was einlesen.seekg(0, ios_base::beg) macht weiß ich leider nicht genau. Ich habe das mit Hilfe des Vo Skripts und alten Beispielen gemacht und verstehe daher leider selber nicht jeden Schritt. Der code für die Berechnungen der addition usw hab ich separat gespeichert, aber der dürfte passen, da das Programm ja schon gelaufen ist als ich die Daten von der Konsole eingelesen habe.
Ich möchte jetzt nur einmal die Daten Zahlen.dat einlesen und auf Ausgabe speichern.
Prinzipiell sieht das Programm jetzt nicht ganz so schlecht aus... aber warum fragst Du in der ersten While-Schleife 7 Zahlen ab? Was sind das für Vectoren?
Zur Dokumentation gehören auch vernünftige Variablennamen: vecein und vecein1 sagt mir nix. Warum landet der dritte Wert in einem Matrixein!?

Ich habe so schwierigkeiten zu verstehen, was das Programm machen soll.
Und ich kann keine Testdaten generieren, weil Du oben 7 und dann später 3 Zahlen pro Datensatz ziehst.

Überleg Dir, ob das so von Dir gewünscht ist und liefere einen Datensatz mit und die Info, was Du damit machen willst (in einer Form, ohne dass ich den ganzen Thread nochmal lesen muss, weil in irgendeinem Nebensatz weiter oben ja eine Information steht).
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

gamma
Beiträge: 33
Registriert: Sa Aug 20, 2016 11:30 am

Re: Einlesen von Daten

Beitrag von gamma » So Nov 13, 2016 8:55 pm

Ok ich habe den Fehler gefunden und zwar habe ich bei einer for schleife ein ; gemacht. Jetzt lassen sich die Daten zumindest einlesen und überschreiben auf eine andere Datei.

Code: Alles auswählen

        while ( einlesen >>a>>a>>a>>a>>a>>a>>a) n++;//System soll die Daten der Form 1 2 3... auf a schreiben.

	{

	einlesen.clear();

	einlesen.seekg(0, ios_base::beg);

	vector<double> vecein(n), vecein1(n),Matrixein(n);//Vektoren auf denen die Daten übertragen werden sollen und später die Berechnungen durchgeführt werden

	int b;

	for (b = 0;b<n;b++)// Schleife welche Werte auf Vektoren überträgt.

	{

	einlesen>>vecein.at(b);

	einlesen>>vecein1.at(b);

	einlesen>>Matrixein.at(b);
vecein ist jener Vektor, auf welche die eingelesenen Daten gespeichert wurden, ebenso vec1 und Matrixein. Bei meiner while Schleife war die Idee hinter den 7 maligen abfrage, dass nur bis zum Leerzeichen gelesen wird, und ich die Daten ja in der Gleichen Form haben möchte wie sie in der ursprünglichen Datei waren. Mein Problem ist es jetzt allerdings, dass zB mein Vektor vecein nur jeden 3. Wert ausgibt, die 1. 3 Koordinaten allerdings x,y,z werte sind. Er enthält also nur x Werte.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Einlesen von Daten

Beitrag von Xin » So Nov 13, 2016 9:29 pm

Wie gesagt... ich weiß nicht, wie Dein Format aussieht. Entsprechend werde ich hier nicht rumraten.

Außerdem sehe ich hier die Möglichkeit, dass std::vector und Mathematik::Vektor hier verwechselt werden. Da besteht schon eine Gemeinsamkeit, aber ich habe den Eindruck, dass hier das Missverständlich ist.
Du pushst pro Durchgang genau 1 Zahl in den Vektor. Es landet kein (x, y, z)-Vektor im std::vector.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten