C Datei auslesen unter "besonderen Bedingungen"

AP Nova

Commander
Registriert
Juni 2008
Beiträge
2.256
Ich würde gerne eine Datei binär auslesen, vorerst reicht es, wenn ich jedes einzelne Zeichen einzeln auslesen kann, alles Weitere könnte ich mir darauf aufbauend zusammenbauen.

Das Problem ist bloß, dass in den zu lesenden Dateien "FF" als Wert vorkommt, also 255, also EOF. Dementsprechend kann ich Folgendes nicht über eine while-Schleife realisieren, da zu früh beendet werden würde.
Code:
while((c = fgetc(Datei)) != EOF);
{         
 printf("%c", c);
}

Als anderer Lösungsansatz fällt mir aktuell nur ein, die Länge der Datei auslesen zu lassen. Allerdings scheint das unter C auch nicht so ohne Weiteres zu gehen und wenn der alle 5 Zeichen meint, da stände jetzt ein EOF, obwohl das "echte" EOF erst viel später erscheint, führt das auch zu keinem Ziel, weil ich das Dateiende nicht einmal bestimmen kann.

Eine Lösung zum Auslesen/Messen der Dateilänge habe ich zwar gefunden, die lief aber bei mir nicht, weil da, wie bei 80% aller Lösungen im Internet, wieder irgendetwas drin war, weswegen meine DE beim Kompilieren rumgemeckert hat.
Hat einer von euch eine Idee, wie man eines der beiden Probleme (direkt Ausgabe bis zum echten Ende oder Umweg über Bestimmung der Länge) lösen könnte? Falls ja bitte möglichst einfach halten und eventuell noch erlären, was was macht.

Als DE verwende ich Dev-C++ 4.9.9.2 ohne irgendwelche Änderungen in den Einstellungen.

Danke für eure Hilfe.
 
fgetc gibt ein int zurück. Für EOF ist es bei mir unter Linux gcc -1. Daher sollte es das Problem das du beschreibst eigentlich nicht geben. Lass es dir mal ausgeben zum vergleich:
Code:
printf("Dec: %d Hex: %x\n",EOF,EOF);

Die Dateigröße kannst du mit fstat erhalten. Dort ist auch Beispielcode.

DevC++ würde ich auch nicht mehr verwenden. Das ist Uralt.

Eine freie Alternative wäre Eclipse mit CDT und einer aktuellen MinGW Umgebung.

Ebenfalls kostenlos ist Microsoft Visual C++ 2010 Express.
Ergänzung ()

Von welchem Datentyp ist die Variable "c"? Wenn es char ist, kann das Problem darin liegen, denn (char)0xff == -1
 
Ich würde auch gerne wieder Eclipse verwenden, das Problem ist da bloß meine Internetverbindung, denn ganz ohne ist Eclipse für mich von der Größe her nicht.

Bei dem von dir genannten Codeschnipsel gibt der mir nebenbei tatsächlich -1 aus. Ich nehme an weil fgetc() einen char zurückgibt betrachtet der das -1 aber gleichzeitig auch als FF, wie es in der Datei steht.

Müsste ich für die Verwendung von fstat in der genannten Weise Folgendes verwenden?
Code:
#include <stat.h>
.
.
.
struct stat stat_p;	
fstat(Datei, &stat_p);
int size = stat_p.st_size;

edit: Wenn ich das so mache sagt der mir "storage size of stat_p is unknown".

edit2: Falls der Download hier der für C/C++ Entwickler ist, kann ich die 87 MB wohl aufbringen.
 
Zuletzt bearbeitet:
für die dateigröße kannst du auch ftell verwenden.
Code:
fseek( handle, 0, SEEK_END ); // pointer ans ende setzen
int s = ftell( handle );
fseek( handle, 0, SEEK_SET ): // den pointer wieder an den anfang der datei setzen
funktioniert natürlich nur für dateigrößen, die in den datentyp (glaube es war int) passen. in msvc gibts noch _ftelli64, im gcc wirds da denk ich noch anderes geben.

aber zum auslesen von dateien, solltest du lieber auf fread, fwrite, ferror, feof setzen. ist praktikabler und du kannst puffern. aber nebenbei: nutzt du auch den binären modus - also z.b. fopen( ..., "rb" );?
 
AP Nova schrieb:
Bei dem von dir genannten Codeschnipsel gibt der mir nebenbei tatsächlich -1 aus. Ich nehme an weil fgetc() einen char zurückgibt betrachtet der das -1 aber gleichzeitig auch als FF, wie es in der Datei steht.

fgetc gibt eben nicht char zurück, sondern int, weshalb die Variable c int sein muss. Darauf bist du aber noch nicht eingegangen.

Wenn das nicht das Problem ist, dann poste am besten mal den ganzen Code. Gerade bei ANSI C gibt es subtile Fehler die man ohne den Kontext zu sehen nicht erkennen kann.
 
Die Lösung con claW. funktioniert, von daher hat sich das Problem wohl erledigt, denn mit der Dateilänge kann ich selbst festlegen, wann der aufzuhören hat. Nebenbei klappte auch folgender Code über das "fgetc()" nicht:
Code:
#include <stdio.h>
#include <stdlib.h>

int main()
{
char name[100];
int counter, c;
FILE *Datei;
printf("Dateinamen eingeben (Datei muss im gleichen Ordner liegen)\n");
fgets(name, 100, stdin);
for(counter = 0; name[counter] != '\0' || counter == 0; counter++){}
name[counter-1] = '\0';
Datei = fopen(name, "rb");
while((c = fgetc(Datei)) != EOF);
{         
 printf("%c", c);
}
scanf("%c", &c);  //Nur da, damit der nicht direkt schließt
return 0;
}
 
Zurück
Oben