Veröffentlicht 23. Juni 200421 j Hallo zusammen, hoffe mir kann jemand bei meim Problem helfen. Ich habs geschaft eine Text-Datei zu speichern, mit den Daten, die ich in einem Array gespeichert habe. Jetzt möchte ich aus dieser Text-Datei den Text auslesen, bekomme das ganze aber irgendwie nicht hin. Hoffe es kann mir jemand helfen. Gruß TripleD PS: Benutze WinXP Prof. und VC++ 6.0 Das ganze ist ne Konsolenanwendung.
23. Juni 200421 j viele wege führen nach rom "fread" wäre eine möglichkeit: #include <stdio.h> size_t fread(void *ptr, size_t size, size_t n, FILE *stream); Beschreibung Liest Daten aus einem Stream. fread liest n Datenelemente, die jeweils die Größe size Bytes haben, aus dem angegebenen Stream in den Speicherbereich, auf den ptr zeigt. Es werden insgesamt (n * size) Bytes gelesen. /*****************************************************/ fgets: #include <stdio.h> char *fgets(char *s, int n, FILE *stream); Beschreibung Liest einen String aus einem Stream. fgets liest einen String aus stream in den durch s angegebenen String und bricht ab, wenn entweder ein Zeilenvorschub (\n) gelesen wird oder n-1 Zeichen gelesen wurden. Der Zeilenvorschub wird am Ende von s gespeichert. Anschließend hängt fgets automatisch ein Nullzeichen (\0) an, um das Ende des Strings zu markieren. /*****************************************************/ fgetc: #include <stdio.h> int fgetc(FILE *stream); Beschreibung Liest ein Zeichen aus einem Stream. fgetc liest das jeweils nächste Zeichen aus dem Eingabe-Stream stream.
23. Juni 200421 j Das mit fread hört sich ja nicht schlecht an. Wo geb ich da den Dateinamen an? Kannst mir vieleicht ein Beispiel machen??? Gruß und Danke TripleD
23. Juni 200421 j #include <string.h> #include <stdio.h> int main(void) { FILE *stream; char msg[] = "this is a test"; char buf[20]; if ((stream = fopen("DUMMY.FIL", "w+")) == NULL) { fprintf(stderr, "Cannot open output file.\n"); return 1; } /* Schreiben von Daten in die Datei */ fwrite(msg, strlen(msg)+1, 1, stream); /* Setzt den Dateizeiger auf den Anfang der Datei */ fseek(stream, SEEK_SET, 0); /* Liest die Daten und zeigt sie an */ fread(buf, strlen(msg)+1, 1, stream); printf("%s\n", buf); fclose(stream); return 0; } funktioniert meines wissens aber nur bei indexsequentiellen dateien (alle zeilen gleich lang...) PS - kann man alles nachlesen unter der Dokumentation deines Compilers!!!
23. Juni 200421 j geht auch mit fstream. dann kann man aus den dateien lesen und schreiben, wie wenn man normale aus- bzw. eingaben macht mit << oder >>. kennst du vielleicht von cin und cout. du musst dann eben fstream.h einbinden. mfg korea1
24. Juni 200421 j Hallo, um nicht gleich ein neues aber ähnliches Thema zu eröffnen, schreibe hier gleich an diesen Beitrag ran. fgets,fgetc und fread sind gute Funktionen, nur habe ich bei fgetc ein Problem und weiß nicht, wie ich es direkt lösen soll: Wenn ich zeichenweise aus einer Datei rauslese, funktioniert das alles sehr gut, aber ein Problem ist z.B. das Auslesen einer Binärdatei. Nach x beliebigen Zeichen erreicht fgetc ohne es wirklich erreicht zu haben das EOF. Warum? Klar ich könnte es mit fread umgehen, aber mich interessiert dieser fgetc-Fehler, insofern es nicht an mir liegt. Achso als Anmerkung: Das entspr. Programm wurde in Zortech C++ Demo Compiler geschrieben, falls das alles Compiler abhängig sein sollte. Gruß Tapeman
24. Juni 200421 j Hallo, poste doch mal den Code der Schleife, in der Du die Datei ausliest. Verwendest Du ein Konstrukt der Art: while (!(c=fgetc(FILE))) { /* tue irgendwas */ }; ? In diesem Fall terminiert die Schleife mit dem ersten Auftreten einen Null-Chars (EOF wird in der Regel durch -1 repräsentiert, daher sollte "c" auch ein signed int sein). Nic
24. Juni 200421 j Hallo, wenn ich mich richtig erinnere, interpretiert fgetc ein leerzeichen als CR ... Nein, fgetc() liefert das Zeichen als integer zurück oder EOF beim Erreichen des Dateiendes. Nic
24. Juni 200421 j So ungefähr: unsigned int c; FILE *fp; fp=fopen(..,..); if (fp!=NULL) { c=fgetc(fp); while(c!=-1) { printf("%c",c); c=fgetc(fp); }; }; also sprich in etwas was Du gesagt hast. Bei Dateien wird das EOF als FFFF dargestellt. Nun dachte ich wenn ich c als unsigned int mache, sehen die Werte so aus: gelesener Char \0, 8, -1 (EOF) c in binär 00000000 00000000, 00000000 00001000, 11111111 11111111 Und somit hätten 0 0 sein müssen und A 65 und EOF -1 sprich FFFF. Ich muß es mal mit VC++6.0 ausprobieren.
24. Juni 200421 j Hallo, So ungefähr: unsigned int c; also sprich in etwas was Du gesagt hast. Bei Dateien wird das EOF als FFFF dargestellt. Du solltest auf alle Fälle mit einem signed int arbeiten, da ansonsten die Rückgabewerte für EOF nicht korrekt behandelt werden können. Der Wert "FFFF" deutet darauf hin, das EOF (-1) als unsigned interpretiert wird. Du vergleichst einen unsigned int mit dem Wert "-1". Nic
24. Juni 200421 j Hmm, kann mir jemand die Bitmuster für signed und unsigned Zahlen liefern, damit ich auf Bitebene einen Unterschied sehen kann?
24. Juni 200421 j hi, soweit ich das noch richtig im kopf hab ist der unterschied von signed und unsigned am paritätsbit zu erkennen. paritätsbit auf 1 -> signed paritätsbit auf 0 -> unsigned damit bleiben nur noch 7 bits übrig um werte darzustellen, da das 8. bit das paritätsbit ist. korrigiert mich, falls ich gerade quark erzählt habe mfg korea1
24. Juni 200421 j Hmm, ich glaube mit dem Paritätsbit bist auf dem richtigen Weg. Datentyp: signed: Paritätsbit=0 --> negativ signed: Paritätsbit=1 --> positiv unsigned: egal ob 0 oder 1 signed: 0000 0000 -> -128 0111 1111 -> -001 1000 0000 -> +/-0 1000 0001 -> +001 1111 1111 -> +127 unsigned: 0000 0000 -> 0 0111 1111 -> 127 1000 0000 -> 128 1111 1111 -> 255 signed=unsigned-128 So meine Schlußfolgerung. Wenn ich ein praktisches Ergebnis habe melde ich mich wieder.
24. Juni 200421 j Ich würde es IMHO in diesem Zusammenhang nicht als Paritätsbit bezeichnen. Aber sonst stimmt das. Paritätsbit wurde zur begrenzten Übertragungsverifikation eines Bytes verwendet.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.