Datei mit JEDEM Inhalt einlesen
-
Hallo - ich stehe gerade völlig ratlos vor einem Problem. Ich möchte den Inhalt einer Datei einlesen - und zwar genau so, wie er in der Datei enthalten ist. Die Datei enthält auch nicht viel mehr als viele tausend einzelne Bytes, die aus dem kompletten ASCII-Spektrum stammen können.
Hier mal meine Funktion:char buffer; char * data; /* ein wenig Code */ for(i = 0 ; i < 8000 ; i++) { buffer = fgetc(template_in); data[i] = buffer; }
Und noch ein dazu passender Ausschnitt aus der Datei (der erste Ausschnitt, bei dem es Probleme gibt, nach ca. 4000 erfolgreich eingelesenen Zeichen):
žŸ\ 2[JJ"’Žúÿÿ )ÿ )ÿ VMÿ ¡m[L$"*	�ÿ6NTuRQÿ[\ ÿLJ""."ÿ2[\ ÿ (.HU_AyÿyÿP\ (LJ_~:€ÿ
Das sieht jetzt nicht sehr informativ aus, verdeutlicht aber, dass da wirklich JEDES Zeichen vorkommen kann.
Das Problem ist nun, dass unter den Daten auch Zeilenumbrüche und sonstige Steuerzeichen sind, über die ich mit fgetc z.B. nicht hinwegkomme - mir wird dann Dateiende gemeldet und alles geht den Bach runter.
Außerdem passiert es, dass ich ein "\n" einlese und bei der Ausgabe des Zeichens aus dem Speicher ein "\r\n" erhalte. Sah für mich erst nach Windows-Dummheiten aus, aber ich kann mir nicht erklären, wie die da rein kommen sollten.Ich bräuchte also eine Möglichkeit, Zeichen so einzulesen, dass mich das Programm dabei nicht kontrolliert. Es darf keine Rücksicht auf EOF oder sonstiges genommen werden, sondern nur darauf, ob schon die geforderten 8000 Zeichen eingelesen wurden.
Da ich nach einigen Stunden des Herumprobierens keinerlei Idee mehr habe, hoffe ich mal, dass mir hier jemand weiterhelfen kann :).
-
Hi,
nimm fread und zum Öffnen benutze unter Windows das 'binary flag':
fp = fopen ( "data.dat", "rb" );
ansonsten wird ohne das b die Datei unter Windows im Textmodus geöffnet.Windows hat nämlich die Eigenart im Textmodus je nach Transferrichtung aus \n ein \r\n und umgekehrt zu machen.
Gruß,
B.B.
-
Stiefel2000 schrieb:
Ich bräuchte also eine Möglichkeit, Zeichen so einzulesen, dass mich das Programm dabei nicht kontrolliert. Es darf keine Rücksicht auf EOF oder sonstiges genommen werden, sondern nur darauf, ob schon die geforderten 8000 Zeichen eingelesen wurden.
LOL.
-
Ich danke dir, großer Bruder!
Das probiere ich gleich mal aus, klingt vielversprechend. Muss ich beim Zurückschreiben in eine Datei auch etwas beachten?
EDIT: Hat wunderbar geklappt, ich dachte schon, ich werde wahnsinnig über dieses Programm :D. Ich bin jetzt übrigens bei fgetc und fputc geblieben, hätte sonst so einiges an Quelltext umschreiben müssen. Aber bei nächster Gelegenheit teste ich mal fread :).
-
Stiefel2000 schrieb:
Muss ich beim Zurückschreiben in eine Datei auch etwas beachten?
Naja, ebenfalls mit dem binary flag öffnen, sonst macht Windows wie schon erwähnt folgendes:
Schreiben: aus \n wird ein \r\n
Lesen: aus \r\n wird ein \nFread ist für große Datenmenge geeignet, es lassen sich größere Datenmengen auf einmal einlesen. Die kannst du dann im RAM ruckizucki bearbeiten.
Gruß,
B.B.
-
Oha. Mutig.
Wenn Du die komplette Datei 1:1 im Speicher haben willst, mache es so:
int fd, size; char *puffer; if ( (fd = open( file, O_RDONLY | O_BINARY)) == -1){ // hat nicht geklappt, Fehler ausgeben und Ende return; } // Dateigröße bestimmen size = filelength( fd); if (( puffer = malloc( size)) == NULL){ // hat nicht geklappt, Fehler ausgeben und Ende close( fd); return; } read( fd, puffer, size); close( fd);
Der Dateinhalt steht dann in puffer. Schreiben geht dann umgekehrt, es
empfiehlt sich dabei, die Datei zum Schreiben zu Öffnen