printf-Problem
-
Hallo,
hier mal wieder ein Anfänger-Problem! Bei dem Versuch, folgende Datei auf dem Bildschirm anzuzeigen und in eine Datei zu schreiben, erhalte ich lediglich als Ausgabe eine Folge kryptischer Zeichen.Das Programm siehr so aus:
#include <stdio.h>
int main()
{FILE *Zeiger_ein;
FILE *Zeiger_aus;char b[15],s;
char *Einlesen="c:\\Test.txt";
char *Ausgabe="c:\\Ausgabe.txt";Zeiger_ein=fopen(Einlesen,"r");
Zeiger_aus=fopen(Ausgabe,"w");if((Zeiger_ein==NULL)||(Zeiger_aus==NULL))
{
printf(" Fehler beim Oeffnen der Datei\n");
return(-1);
}else
printf("%s",b);
fprintf(Zeiger_aus,"\n %s\n",b);
}und in der auszugebenden Datei steht lediglich "TestTestTest".
Kann mir da jemand helfen?
Danke schon mal,
Rose
-
@Rose, du schreibst das array b[...] in die Datei. Das Array hast du aber zuvor nie initialisiert und damit steht da auch Müll drin. Die Datei c:\\Test.txt öffnest du zwar, jedoch liest du deren Inhalt nicht ein. Vor dem fprintf musst du noch folgendes machen:
long lLen = 0; ... fseek( Zeiger_ein, 0, SEEK_END ); lLen = ftell( Zeiger_ein ); fseek( Zeiger_ein, 0, SEEK_SET ); fread( b, sizeof( char ), lLen, Zeiger_ein ); ... fprintf( ...
-
Vergiss einfach erst mal was Hermann geschrieben hat.
Vertausche einfach printf mit fprintf.fprintf(Zeiger_aus,"\n %s\n",b); printf("%s",b);
Und benutze beim naechsten mal die Code-Tags.
-
Es muss nauterlich Zeiger_ein heissen.
-
Also, ich habe Herrmanns Vorschlag probiert mit den Arrays und es hat funktioniert. Nun noch als abschliessende Frage: Muß man denn Arrys nutzen oder gibts es eine einfachere Methode für die Ausgabe eines Datei-Inhaltes?
Danke auch für die schnelle Hilfe,
Rose
-
@Darkfalcon
So falsch ist das von Herrmann nicht, wie du vielleicht meinst. Nur die Ausgabe sollte dann auch mit frwite() geschehen, anstatt printf(). Wobei am sichersten immer noch fgets() in Verbindung mit fprintf() (fputs(), ...) ist.Nun zu deinem Vorschlag. Was soll das bitte schön bewirken?
@Rose
Erklär doch mal bitte was du genau machen willst. Willst du einfach den Inhalt der einen Datei in die andere Datei schreiben? Oder willst du was anderes?
-
Hallo AJ,
ich möchte zu Übungszwecken den Inhalt einer Datei (hier einer simplen Text-Datei) zum einen auf dem Monitor ausgeben (mit printf) und zum anderen in eine Datei schreiben (mit fprintf). Mit Hilfe von Arrays funktioniert es nun.
VG,
Rose
-
Habe vergessen zu fragen, was man denn mit dem "Ilen"-Befehl macht, d.h., was bewirkt dieser Befehl? Der Rest leuchtet ja ein!
Danke,
Rose
-
@Rose, lLen ist lediglich eine Variable.
fseek verwendet man um den Positionszeiger innerhalb der Datei zu bewegen. Ich setze zuerst den Positionszeiger ans Ende der Datei SEEK_END und lasse mir dann mit ftell die Position geben. Diesen Wert speichere ich in der Variable lLen. Damit weiß ich dann wie groß die Datei ist. Als nächstes setze ich den Zeige wieder auf den Anfang. Zum Schluss lese ich lLen-Bytes aus der Datei in das Array b. Und wie dann schon AJ sagte, solltest du lieber fwrite zum schreiben in die zweite Datei verwenden anstatt fprintf.
-
Die wohl einfachste Methode, ne Datei auszugeben, ist
int copy_file(FILE *in, FILE *out) { int c; if(!in || !out) return -1; while((c = fgetc(in)) != EOF) /* zeichenweise. Einfach, aber laaahm. */ fputc(c, out); return 0; }
Performanter ist aber
int copy_file(FILE *in, FILE *out) { static const int BUFSIZE = 128; char s[BUFSIZE]; if(!in || !out) return -1; while(fgets(s, BUFSIZE, in)) /* Immer BUFSIZE Zeichen auf einmal. Schneller. */ fputs(s, out); return 0; }
-
Hm. Ich hab grad gesehen, dass static const int in C90 nicht zur Initialisierung von Arrays erlaubt ist. Ich finds zwar weniger schön so, aber was solls, so ist es ISO-C90:
#include <stdio.h> int copy_file(FILE *in, FILE *out) { char s[128]; if(!in || !out) return -1; while(fgets(s, 128, in)) fputs(s, out); return 0; }
Ansonsten kannste dir mit wilden Makro-Konstrukten weiterhelfen, aber...sieh selbst:
#include <stdio.h> int copy_file(FILE *in, FILE *out) { #ifndef COPY_FILE_BUFSIZE /* Auf die Art kann zur Compilezeit ne andere * Buffergröße mitgegeben werden */ #define COPY_FILE_BUFSIZE 128 #define ___CFBS_UNDEF /* Damit wir nachher wissen, ob COPY_FILE_BUFSIZE * geundeft werden muss - nicht, dass wir nachher * dem Coder seine Makros unterm Hintern * wegziehen... */ #endif char s[COPY_FILE_BUFSIZE]; if(!in || !out) return -1; while(fgets(s, COPY_FILE_BUFSIZE, in)) fputs(s, out); return 0; #ifdef ____CFBS_UNDEF /* ggf. Kram undeffen */ #undef COPY_FILE_BUFSIZE #undef ____CFBS_UNDEF #endif }
-
für die Tipps und Anregungen. Ich glaube, ich nehme dann doch die Arrays . . .
dazu habe ich nur eine Frage: Wenn ich, wie von Herrmann empfohlen, die Funktion fwrite nehme, funktioniert es nicht mehr und ich erhalte die Fehlermeldung
error C2660: 'fwrite' : Funktion akzeptiert keine 3 Parameter
Was heißt das nun wieder?
Danke,
Rose
-
@Rose, 0xdeadbeef's Vorschlag ist meinem wirklich überlegen
Vor allem bei großen Dateien ist meine Variante nicht sinnvoll.fwrite braucht 4 Parameter:
(1) Zielpuffer
(2) Größe der Datenblöcke
(3) Anzahl der Datenblöcke
(4) DateihandleBeispiel in deinem Fall
fwrite( b, sizeof( char ), lLen, Zeiger_aus );
PS: Eventuell wäre ein Buch über C für dich nicht schlecht.
-
Da ich in Zukunft mit größeren Dateien arbeiten will, werde ich mir das mal aneignen . . .danke also an Oxdeadbeef!!!
Das mit dem Buch wäre vermutlich keine schlechte Idee . .
Ich werde mich sicher an anderer Stelle noch einmal melden
bis dahin,
Rose
-
Rose schrieb:
danke also an Oxdeadbeef!!!
Na du wirst doch wohl nicht unserem "toten Rindfleisch" sein Hex-Präfix unterschlagen wollen
-
@beefy
wie lange wartest du eigentlich in diesem Forum bist du dich registrierst?
wirds wieder ein Jahr dauern?
-
Klappt doch auch so ganz gut.