TripleD Geschrieben 23. Juni 2004 Geschrieben 23. Juni 2004 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. Zitieren
Gottesgeschenk Geschrieben 23. Juni 2004 Geschrieben 23. Juni 2004 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. Zitieren
TripleD Geschrieben 23. Juni 2004 Autor Geschrieben 23. Juni 2004 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 Zitieren
Gottesgeschenk Geschrieben 23. Juni 2004 Geschrieben 23. Juni 2004 #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!!! Zitieren
korea1 Geschrieben 23. Juni 2004 Geschrieben 23. Juni 2004 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 Zitieren
Tapeman Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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 Zitieren
nic_power Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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 Zitieren
Gottesgeschenk Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 wenn ich mich richtig erinnere, interpretiert fgetc ein leerzeichen als CR ... Zitieren
nic_power Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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 Zitieren
Tapeman Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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. Zitieren
nic_power Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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 Zitieren
Tapeman Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 Hmm, kann mir jemand die Bitmuster für signed und unsigned Zahlen liefern, damit ich auf Bitebene einen Unterschied sehen kann? Zitieren
korea1 Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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 Zitieren
Tapeman Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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. Zitieren
kLeiner_HobBes Geschrieben 24. Juni 2004 Geschrieben 24. Juni 2004 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. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.