![]() |
C - Entwicklung Lehreinheit Nr. 5: files Homepage von PS-Trainer - C-Entwicklung - Bibliotheken - an PS-Trainer |
|
|
Dateien / files: |
|
Einige ausgewählte Stream-Funktionen:
|
Übungs-Beispiele:
|
|||||||||
Lesen einer Text-Datei |
Erzeugen sie ein einfaches Programm, mit dem sie Text-Dateien einlesen (und verarbeiten) können. Hier ein Beispiel: | ||
|
|||
Schreiben einer Datei |
Erzeugen sie ein einfaches Programm, mit dem sie Text-Dateien schreiben
können. |
||
|
|||
Lesen und Schreiben einer Text-Datei |
Erzeugen sie ein einfaches "Filter" für Text-Dateien, das die Zeilen numeriert. Eingang: eine beliebige Text-Datei. Ausgang: Die gleichen Daten, jedoch am Anfang jeder Zeile numeriert. |
| Nach diesem Muster können sie "Filter" für jede gewünschte Funktion erzeugen: Sie lesen die Eingabedaten, verändern ("interpretieren") sie nach Bedarf und geben die Ausgabedatei aus. Da sie immer nur einen kleinen Datenbereich beider Dateien offen haben (sliding window), können sie so mit winzigen Programmen fast beliebig große Dateien bearbeiten. | |
Lesen und Schreiben einer Binär-Datei |
Erzeugen sie ein einfaches "Filter"
für Binär-Dateien. |
| Binärdateien sind genauso zu bearbeiten wie Text-Dateien.
Zum Unterschied von diesen können die bytes jedoch jeden beliebigen
Wert annehmen, also 0...255, sind also nicht mehr "printable".
Daher gibt es auch keine "Zeilen" sondern einen kontinuierlichen
Datenstrom, der jeden beliebigen, von Ihnen oder vom Hersteller der Datei
definierten Sinn haben kann. Damit sie einen derartigen Datenstrom bearbeiten können, teilen sie ihn in "verdaubare Brocken" (chunks, z.B. #define chunk 7) ein, die sie in einen Puffer einlesen. Sie müssen lediglich diese(n) Puffer geschickt verwalten, dann ist die Arbeit mit Binärdateien kein Problem. Verwenden sie z.B. als Kontrollzeichen nach jedem chunk ein "*", am Datei-Ende ein "$". Zur "manuellen" Bearbeitung und zur Kontrolle von Binärdateien benötigen sie einen Hex-Editor, mit dem sie beliebige Daten anzeigen (Hex und / oder ASCII) und ändern können. Diese und ähnliche Programme finden sie auf Freeware- und Shareware-Seiten z.B. unter "Entwicklung", "development", usw... Ausgewählte Beispiele (ohne Wertung, Vollständigkeit oder sonstige Gewähr): Ashe (free+share, Grand River, bei ZDnet), Binary Workshop (free, SpyTech bei ZDnet), File Editor (share, bei ZDnet), Frhed (Free Hex Editor, SourceForge, bei ZDnet), Hackman (free, Technologismiki), HexEdit (Expertcomsoft mit C-SourceCode !), HexEditor 2001 (NextSoft), Hex Editor II (share, Diplodock, bei ZDnet), Hex Workshop (share, BreakPoint, bei ZDnet), Hextreme (free, MikerSoft, bei ZDnet oder SimTel), NitroHex (Nitrobit), SunnyNotePad (share, Slavco Illic, bei ZDnet oder tucows), SynEdit (SourceForge, bei nonags), UltraEdit (IDM computer solutions), WinHex (Stefan Fleischmann), ... ... ... Ratsam ist weiter ein Hex-Calculator (Taschenrechner), soferne nicht bereits im Hex Editor integriert: Damit können sie Decimal <-> Hex umrechnen und einfache Rechnungen (z.B. Addition, Subtraktion, log. AND, OR, NOT...) direkt in Hex ausführen können. Praktisch: Ein zusätzlicher Binär-Modus. Ausgewählte Beispiele (ohne Wertung, Vollständigkeit oder Gewähr): Brains RPN-Calc (Adatech), DBcalc (dirkbilland), HexRech u.a. tools (Michael Schikora), khs-calc (khs-instruments), Programmers Calculator inkl. C-Source (Art Dahm, bei vr-web), web-online (bei bloobery, duluth, nyctnetw, TU Berlin), ...... Eine Auswahl nützlicher Funktionen: Verwenden sie hier z.B. nicht die MS-spezifischen Funktionen (wie oben), sondern die portablen Standard ANSI-Funktionen. Diese benutzen zur Referenz von Dateien nicht Pointer auf Strukturen, sondern (int) file-handles, welche die gleiche Wirkung haben: sie definieren jeweils den Zugang zu einem geöffneten Datenstrom. int _open( const char *filename, int oflag [, int pmode] ); Öffnet eine beliebige Datei (ASNI-kompatibel, nicht MS-spezifisch) - Bibliothek <io.h> Parameter: filename (string), oflag (erlaubte Operationen), pmode (Permission mode): oflag is an integer expression formed from one or more of the following manifest constants or constant combinations defined in FCNTL.H. When two or more manifest constants are used to form the oflag argument, the constants are combined with the bitwise-OR operator ( | ). _O_APPEND Moves file pointer to end of file before every write operation. _O_BINARY Opens file in binary (untranslated) mode. _O_CREAT Creates and opens new file for writing. Has no effect if file specified by filename exists. pmode argument is required when _O_CREAT is specified. _O_CREAT | _O_EXCL Returns error value if file specified by filename exists. Applies only when used with _O_CREAT. _O_RANDOM Specifies primarily random access from disk _O_RDONLY Opens file for reading only. _O_RDWR Opens file for both reading and writing. _O_SEQUENTIAL Specifies primarily sequential access from disk _O_TEXT Opens file in text (translated) mode. _O_TRUNC Opens file and truncates it to zero length; file must have write permission. _O_TRUNC used with _O_CREAT opens an existing file or creates a new file. The pmode argument is required only when _O_CREAT is specified. If the file already exists, pmode is ignored. Otherwise, pmode specifies the file permission settings, which are set when the new file is closed the first time. _open applies the current file-permission mask to pmode before setting the permissions. _S_IREAD Reading only permitted _S_IWRITE Writing permitted (effectively permits reading and writing) _S_IREAD | _S_IWRITE Reading and writing permitted Return value: returns an (int) file handle for the opened file. A return value of 1 indicates an error. Beispiel: #define chunk 100 ... ... ... int fh1, fh2, nbytes; unsigned int bytesread, out_done; char inbuffer[chunk],outbuffer[chunk]; ... ... ... fh1 = _open("INPUT.BIN",_O_RDONLY | _O_BINARY ); fh2 = _open("OUTPUT.BIN",_O_RDWR | _O_CREAT | _O_BINARY ,_S_IREAD | _S_IWRITE ); ... ... ... bytesread = _read( fh1, inbuffer, nbytes); byteswrite = _write( fh2, outbuffer, nbytes); ... ... ... _close( fh1 ); _chsize( fh2, out_done ); _close( fh2 ); long _filelength( int handle ); Liest die Länge einer Datei in bytes. Parameter: (int) file handle. Return: Länge in bytes. int _read( int handle, void *buffer, unsigned int count ); Liest Daten von einer geöffneten Datei in einen vorbereiteten Puffer. Parameter: file handle, byte-Puffer, Anzahl der zu lesenden bytes. Return value: Anzahl der tatsächlich gelesenen bytes (kann z.B. am Datei-Ende kleiner als angefordert sein), oder 0 bei EOF oder -1 bei Fehlern. int _write( int handle, const void *buffer, unsigned int count ); Schreibt Daten in eine geöffnete Datei. Parameter: file handle, byte-Puffer, Anzahl der zu schreibenden bytes. Return Value: Anzahl der tatsächlich geschriebenen bytes, -1 bei Fehler. int _chsize( int handle, long size ); Ändert die Dateigröße einer geöffneten Datei. Parameters: file handle, Größe in byte. Return =0 bei Erfolg, oder -1 bei Fehler. |
|
| Aktuelle Daten dieser Seite | Letzte Änderung: |
| |