mit CArchive geschriebene Daten anders wieder auslesen
-
Hallo!
Ich hab einen Quelltext bekommen mit welchen von einem anderen Programm her Statistikdateien erstellt werden. Dies geschieht über CArchive. Da ich keine kostenpflichtige Version von VS/VC besitze habe ich den afx header nicht! (Bitte nicht damit kommen das ich mir es doch kaufen sollte, ich bin schüler = keine geld)
Deswegen Suche ich nach einer anderen Methode die geschriebene Datei wieder auszulesen und die Werte Klartext in eine Textdatei abzuspeichern.BOOL CStatistic::Save() { CFile statistikfile; CString filename=...... filename += "stat.hwa"; if(statistikfile.Open(filename,CFile::modeCreate | CFile::modeWrite)){ CArchive ar(&statistikfile,CArchive::store); ar << m_tStartTime; ar << m_dwTotal; ar << m_dwGood; ar << m_dwBad ar << m_dwMissing ar.Close(); statistikfile.Close(); return TRUE; }Danke schonmal!
concerned
-
Der Archivestream legt doch auch nur die Daten binär ab.
mit fread kannst Du die Sachen lesen.
Ansonsten fprintf, fscanf etc...
-
Hallo Martin Richter,
danke für die Antwort, ich hab mich mal an der Sache probiert, komme aber nur auf unlogische Werte! (Ich hab die Binärdatei und weiß welche Werte bei dieser rauskommen sollten)
#include <stdio.h> #include <iostream> #include <iomanip> using namespace std; int main (void) { FILE *datei = fopen ("stat.hwa","r"); long Daten[33]; int iAnzahlDS = 0; int iAnzahlBY = 0; char ende = 'n'; while(ende == 'n') { cout << endl << "Wie viele Datensätze auslesen?" << endl; cin >> iAnzahlDS; cout << "Wie viele byte hat ein Datensatz?" << endl; cin >> iAnzahlBY; fread (Daten, iAnzahlBY, iAnzahlDS, datei); cout << "Reading Stream.." << endl; for(int zahl = 0; zahl < iAnzahlDS; zahl++) { cout << "Datensatz Nr. " << zahl + 1 << ": " << Daten[zahl] << endl; } cout << endl << "Programm beenden? (y/n)"; cin >> ende; cout << setfill('_') << setw(110); } fclose (datei); return 0; }Das ist mein Programm welches ich zum auslesen geschrieben habe, warum bekomme ich vermeintlich "falsche" Daten zurück?
Ist das Problem vielleicht auf die double word variablen zurückzuführen? (Siehe 1. Post, "ar << m_dwTotal;")
Grüße
Concerned
-
Bin selber drauf gekommen.. die Variablen die gespeichert wurden waren DoubleWords also musst ich den Datentyp von "Daten" auf unsigned long stellen..
hier mal das ganze Programm, vielleicht hilft das ja jemanden
#include <stdio.h> #include <iostream> #include <iomanip> #include <time.h> #include <string> #include <stdlib.h> #include <sstream> #include <fstream> using namespace std; const char txtName[] = "Report.txt"; int main (void) { string test; unsigned long Daten[33]; string Anzeige[35] = { "Startzeit: ", "Maschinenstart: ", "Gesamtteile: ", "Gutteile: ", "Schlechtteile: ", "fehlende Teile: ", "fehlender Besatz: ", "Maschinengutteile: ", "Maschinenschlechtteile: ", "Maschinengesammtteile: " }; Anzeige [26] = "Fehler 'Laenge': "; Anzeige [27] = "Fehler 'Besatzspitze': "; Anzeige [28] = "Fehler 'Besatzluecke': "; Anzeige [29] = "Fehler 'Drahtkontur': "; Anzeige [30] = "Fehler 'Loser Faden': "; Anzeige [31] = "Fehler 'Durchmesser': "; Anzeige [32] = "Fehler 'Symmetrie': "; int iAnzahlDS = 35; int iAnzahlBY = 4; char ende = 'n'; int Anzeigeart = 0; int Temp = 0; int Jahreszahl = 0; int Monat = 0; int Tag = 0; int Stunde = 0; int Minute = 0; while(ende == 'n') { FILE *datei = fopen ("stat.hwa","r"); fread (Daten, iAnzahlBY, iAnzahlDS, datei); cout << "Anzeigeart waehlen" << endl << "clean (1) developing (2)" << endl; cin >> Anzeigeart; system("cls"); if(Anzeigeart == 1) { cout << setw(15) << " Anzeigeart: " << "clean" << endl << endl; } else { cout << setw(15) << " Anzeigeart: " << "developing" << endl << endl; } //Prüfen ob die Datei schon existiert int exist; FILE * f= fopen (txtName,"r"); if(!f) { exist = 0; } else { exist = 1; fclose(f); } ofstream txtDatei; txtDatei.open(txtName, ios_base::app); if(exist == 0) { txtDatei << "Start|Maschinenstart|Gesamtteile|Gutteile|Schlechtteile|fehlende Teile|fehlender Besatz|Maschinengutteile|Maschineneschlechtteile|Maschinengesammtteile|Fehler Laenge|Fehler Besatzspitze|Fehler Besatzluecke|Fehler Drahtkontur|fehler Loser Faden|Fehler Durchmesser|Fehler Symmetrie" << "\n"; } else { txtDatei << "\n"; } for(int zahl = 0; zahl < iAnzahlDS; zahl++) { if(Anzeigeart == 1) { if(!datei) { cout << "konnte datei nich oeffnen"; cin.get(); return 1; } //saubere Anzeige if(Anzeige[zahl] != "") { if(zahl == 0 || zahl == 1) { Temp = Daten[zahl]; Temp = Temp / 60; Temp = Temp / 60; Temp = Temp / 24; Temp = Temp / 365; Temp = Temp + 1970; Jahreszahl = Temp; Temp = Daten[zahl]; Temp = Temp / 60; Temp = Temp / 60; Temp = Temp / 24; Temp = Temp / 30; while(Temp > 12) { Temp = Temp - 12; } Monat = Temp; Temp = Daten[zahl]; Temp = Temp / 60; Temp = Temp / 60; Temp = Temp / 24; while(Temp > 30) { Temp = Temp - 30; } Tag = Temp; Temp = Daten[zahl]; Temp = Temp / 60; Temp = Temp / 60; while(Temp > 24) { Temp = Temp - 24; } Stunde = Temp; Temp = Daten[zahl]; Temp = Temp / 60; while(Temp > 60) { Temp = Temp - 60; } Minute = Temp; ostringstream temp; temp << Tag; test = test + temp.str(); test = test + "."; temp << Monat; test = test + temp.str(); test = test + "."; temp << Jahreszahl; test = test + temp.str(); test = test + " "; temp << Stunde; test = test + temp.str(); test = test + ":"; temp << Minute; test = test + temp.str(); cout << setw(30) << Anzeige[zahl] << Daten[zahl] << " datum: " << Tag << "." << Monat << "." << Jahreszahl << " " << Stunde << ":" << Minute << endl; txtDatei << Tag << "." << Monat << "." << Jahreszahl << " " << Stunde << ":" << Minute << "|"; } else { //ende saubere Anzeige cout << setw(30) << Anzeige[zahl] << Daten[zahl] << endl; txtDatei << Daten[zahl] << "|"; } } } else { cout << setw(2) << zahl << setw(30) << Anzeige[zahl] << Daten[zahl] << endl; Daten[zahl] = NULL; } } txtDatei.close(); cout << endl << "Programm beenden? (y/n)"; cin >> ende; system("cls"); fclose (datei); } return 0; }