istream, ostream - Output in Datei schreiben oder ostream in Struktur lenken?
-
Hallo,
Ich versuche gerade ein Clustering-Algorithmus in meinem Programm zu integrieren und das will grad nicht so recht .. Ich glaube wenn man so was schonmal gemacht hat sollte es eigentlich trivial sein - aber alleine schaff ich das irgendwie nicht

Es geht um den Algo k-Means, mit dem Werte um sogenannte Zentren clustert. So hat man eine ausgeweogene Gruppierung und einen gewissen Abstand zwischen den Clustern. Dafür habe ich eine fertige Implementierung der University of Maryland, die auch eine Anpassung an dem jeweiligen Problem zulässt:
//---------------------------------------------------------------------- // Global parameters (some are set in getArgs()) //---------------------------------------------------------------------- int k = 10; // number of centers int dim = 2; // dimension int maxPts = 1000; // max number of data points int stages = 100; // number of stages istream* dataIn = NULL; // input data streamFür das Clustering an sich steht noch folgende read- und write-Methoden bereit:
//---------------------------------------------------------------------- // Reading/Printing utilities // readPt - read a point from input stream into data storage // at position i. Returns false on error or EOF. // printPt - prints a points to output file //---------------------------------------------------------------------- bool readPt(istream& in, KMpoint& p) { for (int d = 0; d < dim; d++) { if(!(in >> p[d])) return false; } return true; } void printPt(ostream& out, const KMpoint& p) { out << "(" << p[0]; for (int i = 1; i < dim; i++) { out << ", " << p[i]; } out << ")\n"; }die im Code folgenderweise aufgerufen werden:
if (dataIn != NULL) { // read points from file while (nPts < maxPts && readPt(*dataIn, dataPts[nPts])) nPts++; } // Clustering .. cout << "Data Points:\n"; // echo data points for (int i = 0; i < nPts; i++) printPt(myOStream, dataPts[i]);Nun, ich habe versucht den in- und out-Stream auf Dateien zu lenken:
ostream* myOStream = new ofstream("KCT.txt", ios::out); cout << "Data Points:\n"; // echo data points for (int i = 0; i < nPts; i++) printPt(myOStream&, dataPts[i]);aber das funktioniert natürlich nicht. Noch lieber würde ich die Werte von einem ublas-Vektor als Input verwenden und diese dann in einem anderen Vektor speichern statt mit Dateien zu arbeiten, aber das schien noch komplizierter als den Umweg über die Dateien. Hat jemand einen Hint wie ich vorgehen kann?
Viele Grüße,
C.Achso, beim Kompilieren des Codes wie der hier ist, bekomm ich den Fehler
error C2784: 'std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &,const std::_Smanip<_Arg> &)' : could not deduce template argument for 'std::basic_ostream<_Elem,_Traits> &' from 'std::ofstream *'
-
Nur kurz überflogen: Schau dir mal die Signatur an
void printPt(ostream& out, const KMpoint& p)und schau dir mal deinen Aufruf an
printPt(myOStream&, dataPts[i]);wobei myOStream ein Pointer auf einen ofstream ist.
Davon mal abgesehen, dürfte deine Anweisung wegen Syntax-Fehler schon nicht compilieren

HTH
Tante Edit sagt:
printPt(*myOStream, dataPts[i]);sollte reichen.
-
überlade doch die entsprechenden Operatoren dann kann man diese auch einfach verwenden:
ostream& operator << (ostream &ostr, const KMpoint& p) { ostr << "(" << p[0]; for (int i = 1; i < dim; i++) ostr << ", " << p[i]; ostr << ")\n"; return ostr; }KMpoint kmpnt; //mit irgendeinem Wert cout << kmpnt; //oder aber ostream datei(.....); datei << kmpnt;
-
Vielen lieben Dank, hab alles umgeschrieben und es funktioniert fehlerfrei
