wie kann man einen Vektor oder eine Matrix in einem txt-File abspeichern oder die aus dem .txt-File wieder laden???
-
folgend hab ich zwei Funktionen zu implementieren:
**void Clever::loadModel(string path)
void Clever::saveModel(string path)**
Es geht darum, das Model (also die Matrizen prior, transmat, transmat2, obsmat und RImat in einem txt-File abspeichern (saveModel) bzw. aus dem .txt-File wieder laden zu können (loadModel). Die .txt-Datei soll sowohl für den Rechner als auch für einen Menschen gut lesbar sein und ungefähr so aussehen:
-------------------------------------------------------------------------------Learning Model for InTeach
NrOfStates = 3
NrOfEmssions = 6**Prior
**
0 4 0Transmat
2 3 3
3 6 3
3 3 0
**Transmat2
**
11: 0 2 012: 0 2 1
13: 2 1 0
21: 2 0 1
22: 2 0 1
23: 1 2 0
31: 0 1 2
32: 1 1 0
33: 0 0 0
Obsmat
0 8 0 0 0 0
0 0 7 1 6 2
0 0 3 2 1 0
RImat
11: 0.1 0.1 0.1
12: 0.1 0.1 0.1
13: 0.1 0.1 0.1
21: 0.1 0.1 0.1
22: 0.1 0.1 0.1
23: 0.1 0.1 0.1
31: 0.1 0.1 0.1
32: 0.1 0.1 0.1
33: 0.1 0.1 0.1
-------------------------------------------------------------------------------
Die 3D-Matrizen sind so aufgebaut, dass hinter 11: die Einträge für 111 112 113 stehen, also jeweils die letzte Dimension zu den gegebenen beiden ersten Dimensionen.-------------------------------------------------------------------------------
Kann jemand mir paar Hinweise geben,womit ich anfangen soll?Vielen Dank:D

-
Schau dir mal die C++-Filestreams an (
std::fstream). Damit lässt sich komfortabel in Dateien schreiben bzw. von Dateien lesen.Unter www.cplusplus.com findet man einige Informationen dazu.
-
Und um es gleich zu sagen: Niemand macht hier deine Hausaufgaben.
-
The-Kenny schrieb:
Und um es gleich zu sagen: Niemand macht hier deine Hausaufgaben.
Hat er auch nicht erwartet. Hätte er sonst Folgendes geschrieben?
ent.yangyang schrieb:
Kann jemand mir paar Hinweise geben,womit ich anfangen soll?Vielen Dank:D

-
haha,danke für die Aufklärung und die Tipps.
ich lerne gerade drüber noch
werde diese Probleme selber lösen.
Falls es mir nachher noch irgendwas unklar wäre,würde euch vielleicht noch um die Hilfe bitten :p
-
Also generell kannst du auch einfach zeilenweise einlesen und dann mit Hilfe von Trennzeichen die einzelnen Werte herausparsen.
Beispieldatei:
0;1;2;3 4;5;6;7 8;9;10;11Hat den Vorteil, dass du die Datei auch einfach mit Excel / OpenOffice anschauen kannst.
-
Jetzt kommt die Frage

Ich hab versucht,mit der Funktion saveModel(string path) anzufangen.
kompillieren tut es gut.aber ich kann diese .txt Datei in D:\ nicht finden.Ich kann deswegen nicht weiter machen,weiß nicht wie den Inhalt der .txt Datei aussieht....kann jemand mir mal helfen?vielen Dank!

#include "stdafx.h" #include <CleverRobot.h> #include "Util.h" #include <vector> #include <iostream> using namespace std;int main() { //Testen saveModel CleverRobot robot=CleverRobot(); string path="D:\TEXT.txt"; robot.saveModel(path); return 0; }void CleverRobot::saveModel(string path) { vector<float> tmp(3); tmp.at(0)=1; tmp.at(1)=2; tmp.at(2)=3; // save data to path ofstream fout("path",ios::out|ios::binary); if(!fout) { cerr<<"can't open the file"<<endl; exit(1); } int a=(int)tmp.size(); for(int i=0;i<a;i++) fout.write((char*)&a,sizeof(a)); fout.close(); }
-
int main() { //Testen saveModel CleverRobot robot=CleverRobot(); string path="D:\\TEXT.txt";//hier müssen zwei "\" hin robot.saveModel(path); return 0; }Weiterhin musst du es so machen.
ofstream fout(path.c_str(),ios::out|ios::binary);
-
Firefighter schrieb:
int main() { //Testen saveModel CleverRobot robot=CleverRobot(); string path="D:\\TEXT.txt";//hier müssen zwei "\" hin robot.saveModel(path); return 0; }Weiterhin musst du es so machen.
ofstream fout(path.c_str(),ios::out|ios::binary);Firefighter schrieb:
int main() { //Testen saveModel CleverRobot robot=CleverRobot(); string path="D:\\TEXT.txt";//hier müssen zwei "\" hin robot.saveModel(path); return 0; }Weiterhin musst du es so machen.
ofstream fout(path.c_str(),ios::out|ios::binary);vielen Dank!!

hab's erzeugt.aber mein Vektor in .txt Datei sieht irgendwie so aus:
-
warum nimmst du zum schreiben ios::binary ich dachte die datei soll auch für menche lesbar sein? Bin binary klappt das aber nur für die maschine ^^
-
blups0r schrieb:
warum nimmst du zum schreiben ios::binary ich dachte die datei soll auch für menche lesbar sein? Bin binary klappt das aber nur für die maschine ^^
ja,daran hab ich auch mal gedacht.hab mein Prototyp verändert wie folgendes:
ofstream fout(path.c_str(),ios::out|ios::dec)dann wird das Programm abgebrochen bei:
if(!fout) { cerr<<"can't open the file"<<endl; exit(1); }
-
ich hab jetzt einfach den Operator
<<verwendet,und es hat dann geklapt :
int main() { CleverRobot robot=CleverRobot(); string path="D:\\TEXT.txt"; //robot.loadModel(path); robot.saveModel(path); //robot.loadModel(path); return 0; }void CleverRobot::saveModel(string path) { //TESTEN vector<float> tmp(5); tmp.at(0)=1; tmp.at(1)=2; tmp.at(2)=3; tmp.at(3)=4; tmp.at(4)=5; // save data to path ofstream fout(path.c_str());//Prototyp //Fehlerhandlung if(!fout) { cerr<<"can't open the file"<<endl; exit(1); } fout<<"prior"<<endl; for(int i=0;i<(int)tmp.size();i++) fout<<tmp.at(i)<<" "; fout.close(); }in der .txt Datei wird folgendes gezeigt:
prior
1 2 3 4 5
-
jetzt ist es die Frage:wie kann man diese Char im Vektor "prior" ("1" "2" "3" "4" "5")
wieder aus der .txt Datei reinladen,und ins neue Model wie z.B. einen Vektor umwandeln?
:xmas2:
-
ifstream::operator >> ist da dein Freund.

float temp = 0.0f; std::vector<float> cont; std::ifstream in("in.txt"); while ( in >> temp ) cont.push_back ( temp );