Matrix Datei-Ausgabe

schickano

Grünschnabel
Gude Leutz,

Leider bin ich total planlos im Gebiet der Ein- und Ausgabe und stehe vor dem Problem das ich eine Matrix in eine Datei ausgeben muss. Deshalb wende ich mich mit meinem Problem an euch.

Meine Matrix ist vom Typ vector<vector<double>> dessen Zeilen und Spalten bekannt sind.

Vielen tausend Dank für jeden Beitrag/ Tipp/ Rat uvm :D

Gruß Schickano
 
Hallo,
"eine Matrix in eine Datei ausgeben"
Willst du einen Vektro in einer Datei(z.B vektor.txt) speichern?
Ich verstehe noch nicht ganz was du genau vor hast.
Wie sieht der Vektor denn aus?
Ist der Vektro mittels struct definiert worden?
Hast du vilt schon einen Quelltext?

MfG finnex
 
Wo liegt das Problem?
Datei öffnen; jedes Element ausgeben ; nach jeder Zeile ein \n machen; Datei schließen?
Kommst du mit den Dateifunktionen nicht zurecht?
 
@finnex
ich hab mir durch die Vektor-Klasse eine Matrix aufgebaut

Code:
const int n = 4;
double val_1[n] = {1,2,3,4};
double val_2[n] = {5,6,7,8};

vector<double> v1;
vector<double> v2;
vector<vector<double>> matrix

v1.insert(v1.begin(), val_1, val_1 + n);
v2.insert(v2.begin(), val_2, val_2 + n);

matrix.push_back(v1);
matrix.push_back(v2);

@sheel
Ich komm mit den Dateifunktionen nicht zurecht, versuchs grad anhand eines BeispielCode mir zusammenzubasteln.
Code:
char * buffer;
  long size;

  ifstream infile ("test.txt",ifstream::binary);
  ofstream outfile ("new.txt",ofstream::binary);

  // get size of file
  infile.seekg(0,ifstream::end);
  size=infile.tellg();
  infile.seekg(0);

  // allocate memory for file content
  buffer = new char [size];

  // read content of infile
  infile.read (buffer,size);

  // write to outfile
  outfile.write (buffer,size);
  
  // release dynamically-allocated memory
  delete[] buffer;

  outfile.close();
  infile.close();
 
Willst du das ganze menschen-lesbar abspeichern, oder so dass du es möglichst einfach wieder in Programm laden kannst?
 
Möglichst einfach wieder in Programm laden

Code:
	const int n = 4;
	double val_1[n] = {1,2,3,4};
	double val_2[n] = {5,6,7,8};

	vector<double> v1;
	vector<double> v2;
	vector<vector<double>> matrix;

	v1.insert(v1.begin(), val_1, val_1 + n);
	v2.insert(v2.begin(), val_2, val_2 + n);

	matrix.push_back(v1);
	matrix.push_back(v2);

	ofstream outfile ("new.txt");

	for(int i = 0; i < matrix.size(); ++i){
		size = matrix.at(0).size();
		outfile.write (&matrix.at(0),size);
	}

	outfile.close();

Das habe ich zusammengebraut. Bei der write Zeile bekomme ich ein Problem weil er ein char erwartet. Wie könnte ich das lösen?
 
Also erstens hast du beim öffnen das ::binary vergessen
(beim ofstream outfile ("new.txt") )

Danach würde ich ersteinmal Anzahl der Zeilen/Spalten speichern
Erleichtert das Einlesen.
Bei dir hat doch jede Zeile gleichviel Spalten oder hast du unterschiedlich viel?
Ich nehm einmal an, jede Zeile ist gleich lang:

C++:
int a,b;
double dou;
a=matrix.size();
outfile.write ((char *)(&a),sizeof(s));
b=matrix.at(0).size();
outfile.write ((char *)(&b),sizeof(s));

Danach: Ich glaub eher nicht, dass man einfach mit & auf den Inhalt eines ganzen Vectors zugreifen kann, also besser jedes Element einzeln durch
C++:
for(int i=0;i<a;i++)
{
    for(int j=0;j<b;j++)
    {
        dou=matrix.at(i).at(j);
        outfile.write ((char *)(&dou),sizeof(dou));
    }
}
Danach wieder Schließen, hast du sowieso schon im Programm

Gruß
 
Zuletzt bearbeitet:
Vielen Dank sheel.

Die Art und Weise hab ich empfohlen bekommen. Scheint ziemlich simpel zu sein.

C++:
	ofstream outfile ("new.txt");

	for(int i=0; i<matrix.size(); ++i) {
		for(int j=0; j<matrix.at(0).size(); ++j) {
			outfile<<matrix.at(i).at(j)<<' ';
	   }
	   outfile<<'\n';
	}

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Danach: Ich glaub eher nicht, dass man einfach mit & auf den Inhalt eines ganzen Vectors zugreifen kann, also besser jedes Element einzeln durch
Doch, man kann. :) Die Elemente eines std::vector werden hintereinander im Speicher gehalten.
Die Art und Weise hab ich empfohlen bekommen. Scheint ziemlich simpel zu sein.
Natürlich ist das simpel. So sah doch auch dein Eingabeformat aus, oder?!

\edit: wobei es nicht schaden würde Standardalgorithmen der STL zu verwenden. Z.B. std::copy mit einem std::ostream_iterator, so wie Matthias es dir auch für das Einlesen gezeigt hat.

Gruß
 
Heute Abend werde ich mein Glück mit dem Iterator versuchen.

Sobald ich es hab stell ich es sofort online und wart auf Euer Segen.

Gruß
 
Zurück