fread in der Konsole auseben
-
Hallo,
ich weiß nicht ob der Code so richtig ist. In meiner Main.c Datei wird bei return 0 Erfolg, bei Return 1 Fehler ausgeben beim öffnen der Datei und Return 2 Fehler bei Auslesen der Datei.
Außerdem wird der Inhalt in der Konsole ausgebeben.
main.c:#include <stdio.h> #include <string.h> #include <errno.h> #include "test.h" int main(int argc, char * argv[]) { int result; char * filename = "test.txt"; result = print_file(filename); if (result == 1) { printf("Fehler beim Oeffnen der Datei '%s': %s\n", filename, strerror(errno)); } if (result == 2) { printf("Fehler beim Lesen der Datei '%s': %s\n", filename, strerror(errno)); } if (result == 0) { printf("Erfolgreich beim Oeffnen der Datei '%s'\n", filename); } system("pause"); return 0; }
test.c
#include "test.h" #include <stdio.h> #include <stdint.h> #include <string.h> #define BUFFER_SIZE 512 int print_file(char *filename) { FILE *file; char size; int i; int buffer[BUFFER_SIZE]; file = fopen("filename", "r+b"); do { if (file != NULL) { size = fread((void *)buffer, 1, BUFFER_SIZE, file); } else { return 1; } printf(" %.*s", size, buffer); } while (feof(file) != 0); if (feof(file) == 0) { return 0; } else if (ferror != 0) { return 2; } fclose(file); }
In Moment steht bei mir Fehler beim Öffnen der Datei mit der Fehlermeldung no such file or directory. Ich habe auch den vollständigen Dateipfad mit doppelten Backslash angegeben trotzdem funktioniert es nicht.
Ich bedanke mich im Voraus.
-
Du setzt bei dem fopen Aufruf in Zeile 14 (in test.c) filename in Anführungszeichen. Da diese Datei dann offenbar nicht existiert, erhälst du einen Fehler.
-
Der Code ist kompletter Nonsens.
- wozu (void*) Cast?
- ferror ist eine Standardfunktion und demzufolge auch als solche zu gebrauchen
- du verwechselst den return-Wert von feof()
- printf auf ein int-Array funktioniert so nicht
- das Laufzeitsystem sucht eine Datei ohne Pfadangabe im aktuellen Verzeichnis (was nicht unbedingt das Standortverzeichnis des Programms sein muss, insbesondere nicht, wenn du dein Programm aus der IDE heraus startest)
- system("pause") ist Schrott
-
Was ich auch etwas komisch finde:
In Zeile 13 von test.c, setzt du einen "int" buffer:
int buffer[BUFFER_SIZE];
In der Ausgabe lässt du diesen als String ausgeben.
Und in deiner Datei-Routine castest du es zum void Pointer, damit fread den Parameter nimmt.
size = fread((void *)buffer, 1, BUFFER_SIZE, file);
und
printf(" %.*s", size, buffer);
Warum nicht gleich ein Char Array und dann die Nutzung von atoi um den String in einen Int Wert zu casten, wenn du einen Int am Ende benötigst?
-
Vielen Dank, die Tipps haben mir geholfen. Habe zumindest in der Konsole stehen was stehen soll.
Ich bin aber nicht ganz zufrieden, vorallem mit ferror und feof nicht. Kann mir ´jemand sagen ob ich die falsch oder richtig einsetze?#include "uebung4.h" #include <stdio.h> #include <stdint.h> #include <string.h> #define BUFFER_SIZE 512 int print_file(char *filename) { FILE *file; char size; char buffer[BUFFER_SIZE]; file = fopen(filename, "r+b"); do { if (file != NULL) { size = fread(buffer, 1, BUFFER_SIZE, file); } else { return 1; } printf(" %.*s", size, buffer); } while (feof(file) == 0); if (feof(file) != 0) { return 0; } else if (ferror != 0) { return 2; } fclose(file); }
Auch nach mehrmals nachlesen verstehe ich nicht ganz wofür die 1 bei fread steht, hatte ich so übernommen. Eine kurze verständliche Erklärung wäre hilfreich.
-
Thisisit schrieb:
Auch nach mehrmals nachlesen verstehe ich nicht ganz wofür die 1 bei fread steht, hatte ich so übernommen. Eine kurze verständliche Erklärung wäre hilfreich.
Der Paramter size gibt die Größe eines Elmentes in Bytes an, das gelesen werden soll.
Die Gesamtzahl der Bytes ergibt sich aus
size*count
#define ANZAHL 100 short feld [ANZAHL]; int array[ANZAHL]; fread (feld, sizeof(*feld), ANZAHL,file); fread (array, sizeof(*array),ANZAHL,file);