Von einer Bildschirmausgabe zum abspeichern in einer Datei
-
Hi,
ich habe ein Programm welches mir Dateien Konvertiert, die Konvertierung ist nur leider bisher nur in einer Konsolenausgabe einsehbar. Wie kann ich nun die Konvertierung in einer Datei abspeichern? Am besten in dem gleichen Verzeichnis wie die Ausgangsdatei.void Konvert(const char *filename) { FILE *f = fopen(filename, "rb"); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); printf("%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday , stm.tm_mon , stm.tm_year + 1900 , stm.tm_hour , stm.tm_min , stm.tm_sec , DEARecord.Millisec > 0 ? DEARecord.Millisec : 0); printf("DEARecord: Zustand = %d, Kennung = %d, Grund = %c\n", DEARecord.Wert.Zustand , DEARecord.Kennung , DEARecord.Grund); } fclose(f); }
Danke schonmal!!
-
fprintf() anstelle von printf() verwenden (das bekommt vor dem Formatstring das FILE übergeben, wo die Ausgabe landen soll).
PS: Das C Forum ist eine Etage höher
-
Hmm, ich dacht ich quäle mich mit C++...
Wenn ich fprintf() benutze bekomme cih folgende Fehler:cannot convert `const char*' to `FILE*' for argument `1' to `int fprintf(FILE*, const char*, ...)'
und das dann für beide printf().
Muss ich nicht auch erst ne Datei aufmachen wo cih reinschreiben kann?
Und wie kann ich die Endung von einer Datei ändern? Ich habe im Moment .pls und bräuchte dann den gleichen Dateinamen nur mit .txt, notfalls auch angehängt, müssen sich halt nur unterscheiden.
-
nixversteher schrieb:
Hmm, ich dacht ich quäle mich mit C++...
Ich sehe zumindest nichts in dem Code, was nach C++ aussieht. (btw, in C++ würde ich lieber IO-Streams anstelle von FILE*en verwenden)
Wenn ich fprintf() benutze bekomme cih folgende Fehler:
cannot convert `const char*' to `FILE*' for argument `1' to `int fprintf(FILE*, const char*, ...)'
und das dann für beide printf().
Muss ich nicht auch erst ne Datei aufmachen wo cih reinschreiben kann?
Ja, mußt du - woher soll das Programm sonst wissen, wo die Daten hinsollen.
FILE* fout = fopen(filename2,"w"); ... fprintf(fout/*erster Parameter ist das Ziel-FILE*/,.../*ab hier kommen die Parameter aus deinen printf()-Aufrufen*/); ...
Und wie kann ich die Endung von einer Datei ändern? Ich habe im Moment .pls und bräuchte dann den gleichen Dateinamen nur mit .txt, notfalls auch angehängt, müssen sich halt nur unterscheiden.
Den Dateinamen inklusive Endung gibst du beim fopen()-Aufruf an - wenn du da etwas ändern willst, mußt du den Namen nur anpassen (z.B. die letzten drei Zeichen durch "txt" ersetzen).
-
Moin moin,
unter C++ verwendest du für Konsolen- und Dateiausgaben Streams (cout bzw. ofstream) und damit den Operator<<.
Du kannst auch Klassen von C-Structs ableiten. So könntest du den Struct DEA_ARCHIV_TYP durchaus ableiten und mit Methoden versehen, welche du dann wie folgt verwenden könntest:
(Anriss)
class DeaArchiv : public DEA_ARCHIV_TYP { // ... }; // ... // Beispielhaft für auslesen aus einer Datei und Ausgabe auf dem Bildschirm ifstream infile("daten.txt"); DeaArchiv arch; infile >> arch; cout << arch; // Ausgabe exemplarisch in eine Datei durchführen ofstream outfile("neue_daten.txt"); DeaArchiv arch; infile >> arch; outfile << arch;
Grüße...
Heiko
-
Danke, für die flotte Hilfe, nur leider bin ich ein absoluter Anfänger was C++ angeht. Und mach es nur im Zuge meines Praxissemesters.
Dementsprechend habe ich von Klassen usw. noch überhaupt keinen Plan.In der Variablen 'filename' steht der Pfad der zu konvertierenden Dateien drinn, ist es möglich mit fopen() an diesen Dateinamen ein'.txt' anzuhängen?
Dann hätte ich eine bessere Zuordnung im Verzeichnis. Einmal die nicht konvertierten *.pls Dateien und einmal die Konvertierten *.txt Dateien.Habe es eben schon mit
fopen(filename +".txt", "w")
versucht, nur leider hat das mal garnicht funktioniert. Wie geht das am besten?
-
Ja, filename ist auch "nur" ein char-Zeiger - der unterstützt keine String-Verkettung mit +, sondern bestenfalls mit strcat() (das erfordert allerdings, daß der Speicherplatz ausreicht).
-
Habe jetzt:
FILE *f = fopen(filename, "rb"); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); FILE *fout = fopen(filename, "w"); fprintf(fout,"%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday , stm.tm_mon , stm.tm_year + 1900 , stm.tm_hour , stm.tm_min , stm.tm_sec , DEARecord.Millisec > 0 ? DEARecord.Millisec : 0); fprintf(fout,"DEARecord: Zustand = %d, Kennung = %d, Grund = %c\n", DEARecord.Wert.Zustand , DEARecord.Kennung , DEARecord.Grund); } fclose(f); fclose(fout);
Kompilieren geht, allerdings steigt mein Programm jetzt vor der ersten Konvertierung mit der "Main.exe hat ein Problem und muss beendet werden.... An Mircosoft senden?" Nachricht aus!
Ist es so kompliziert ne Bildschirmausgabe in eine Datei umzulenken?
Ich verzweifel langsam...
-
Du versuchst da, dieselbe Datei zum Schreiben zu öffnen, die du vorher zum Lesen geöffnet hast. Und du prüfst übrigens nicht, ob das geklappt hat
-
Ok, dann evtl anders, mir wurde ja schon der IO-Stream für C++ empfolen, wie würde ich da die Bildschirmausgabe in eine Datei bekommen?
Ich habe mitofstream f1 ("test.txt")
einen Stream geöffnet und die vorher nicht vorhandene Datei erzeugt.
Wie kann ich nun den Inhalt der printf-Anweisung in die Datei lenken?
-
IO-Streams haben ihre eigenen Möglichkeiten, die Ausgaben zu formatieren - die überhaupt keine Ähnlichkeit mit den printf()-Formatierungen zu tun haben. Das heißt, du müsstest deine komplette Ausgabefunktion umbauen.
(übrigens ist es auch bei fstream notwendig, Fehler abzufangen)
-
nixversteher schrieb:
Ok, dann evtl anders
Warum verwendest du nicht einfach nur einen anderen Dateinamen für die Ausgabedatei?
-
Ok, Ausgabe komplett abändern ist gar nciht gut.
Um das Fehlerabfangen kümmer ich mich noch, ich würde das Programm nur gerne erst mal zum laufen bringen um was in der Hand zu haben damit ich meinen Bericht schreiben kann
-
Dann doch FILE* (so sehr es mich sträubt, das zu empfehlen) - jetzt mußt du "nur" noch den übergebenen Dateinamen umbauen (oder du übergibst der Funktion gleich zwei verschiedene Dateinamen).
-
MFK schrieb:
Warum verwendest du nicht einfach nur einen anderen Dateinamen für die Ausgabedatei?
Ich nehme jetzt erst mal einen festen Dateinamen um erst einmal die Funktion zu bekommen.
Der fprintf funzt bei mir nur überhauptnicht:void Konvert(const char *filename) { FILE *f = fopen(filename, "rb"); if (f) { DEA_ARCHIV_TYP DEARecord; while(!feof(f)) { fread(&DEARecord, sizeof(DEARecord), 1, f); struct tm stm = *localtime(&DEARecord.Startzeit); FILE *fout = fopen("test.txt", "w"); fprintf(fout,"%02d.%02d.%04d %02d:%02d.%02d,%03d : ", stm.tm_mday , stm.tm_mon , stm.tm_year + 1900 , stm.tm_hour , stm.tm_min , stm.tm_sec , DEARecord.Millisec > 0 ? DEARecord.Millisec : 0); fprintf(fout,"DEARecord: Zustand = %d, Kennung = %d, Grund = %c\n", DEARecord.Wert.Zustand , DEARecord.Kennung , DEARecord.Grund); } fclose(f); }
Bei dem Code habe ich beim Kompilieren kein Problem, allerdings schmiert mir das Programm nach 3 Dateien ab und die Konvertierung wird weder ausgegeben noch in die Datei geschrieben.
-
CStoll schrieb:
Dann doch FILE* (so sehr es mich sträubt, das zu empfehlen) - jetzt mußt du "nur" noch den übergebenen Dateinamen umbauen (oder du übergibst der Funktion gleich zwei verschiedene Dateinamen).
Das "nur" macht mir etwas Angst.
Und von mir kommt ein "wie" oder "womit"
-
@Absturz: Hast du mal im Debugger verfolgt, was da passiert? (btw solltest du die Ausgabe-Datei auch wieder schließen, wenn du fertig bist)
@Umbau des Dateinamens: mit std::string wäre es einfach, mit char* wird es ein wenig komplizierter. Ich würde strrchr() den Punkt im Dateinamen suchen und alle Zeichen dahinter mit der neuen Endung überschreiben (strcpy()).
-
womit arbeitest du nochmal also welcher entwicklungsumgebung?
versuch es doch mal zu debuggen und schau dir an was bei fread rauskommt und ob nach fopen dein fout überhaupt einen sinnvollen wert hat (also keinen fehlerwert z.B.)
um die fehlerbehandlung solltest du dich imo sofort kümmern, das hilft meist unerklärliche fehler durchsichtiger zu machen
*ich sollte noch n kaffee trinken ich bin einfach zu langsam* *GG*
-
Ich arbeite mit Dev-C++.
Ich versuch es mal mit dem Debugger, danke.
-
Aussager Debugger:
Eine Zugriffsverletzung (Segmentation Fault) trat in ihrem Programm auf??
Ist das etwas wovor ich gewarnt wurde?