Beruflich Dokumente
Kultur Dokumente
ZEIGER GERÄTEDATEI
stdin Standardeingabe
stdout Standardausgabe
stderr Standardfehler-
ausgabe
Zugriffsarten zu Dateien
In C existieren zwei Zugriffsarten:
• High-Level-Zugriff (gepufferte EA)
• Low-Level-Zugriff (ungepufferte EA)
Für jede Zugriffsart steht jeweils eine Menge
bestimmter EA-Funktionen zur Verfügung.
Bei beiden Zugriffsarten stellt die Daten-verwaltung
des Betriebssystems den Inhalt der Datei
unabhängig von der Dateiorganisationsform als
Strom von Zeichen dar.
Der Nutzer kann in C Dateien als Text- oder
Binärdateien betrachten, die bezüglich Steuer-
zeichen unterschiedlich behandelt werden, aber
das Strom von Zeichen – Prinzip gilt bei beiden.
Peter Sobe Informatik I, Sommersem. 2011 2
Zugriffsprinzipien
In C existieren folgende Zugriffsprinzipien:
• zeichenweise E/A (sequentiell)
• zeilenweise E/A (sequentiell)
• formatierte E/A (sequentiell)
• direkte E/A (über direkte Positionierung,
nicht sequentiell)
Für jedes Zugriffsprinzip steht jeweils eine Menge
bestimmter EA-Funktionen zur Verfügung.
Beim formatierten Zugriffsprinzip kann über die
Formatsteuerung im Strom von Zeichen andere Objekte,
wie Zahlen usw. identifiziert und verarbeitet werden.
Zugriffsmodi (Fortsetzung)
Zugriffsmodus Ziel
High-Level-Zugriff zu Dateien
FILE-Struktur
Zeiger auf
Puffer
Zeiger auf
nächstes
Zeichen im
Puffer
Anzahl
Zeichen im
Puffer
Deskriptor
FILE-Zeiger
#include <stdio.h>
void main()
{
FILE *fp; //Deklaration File-Zeiger
fp = fopen(„c:\\meinefreunde.txt“,“r“); //Pfad-Angabe
...........
fclose(fp);
}
Kann die Datei nicht geöffnet werden, ist fp mit NULL belegt.
Deshalb sollte nach fopen der Dateizeiger auf NULL getestet
werden, ehe eine Verarbeitung eingeleitet wird.
Peter Sobe Informatik I, Sommersem. 2011 9
#include <stdio.h>
void main()
{ char c; FILE *fp;
fp = fopen(„c:\\dat.txt“,“r“);
if (fp!=NULL)
{ c=fgetc(fp); //Lesen nächstes Zeichen
if (c==EOF) ... //Prüfen auf EndOfFile
fclose(fp);
}
Nach jeder Leseoperation sollte auf das Erreichen des
Dateiendes (EOF) getestet werden.
#include <stdio.h>
void main()
{ char c; FILE *fp; fp = fopen(„c:\\dat.txt“,“r“);
if (fp!=NULL)
{ do {
c=fgetc(fp); //Lesen nächstes Zeichen
...... Verarbeitungsanweisungen
} while (c!=EOF) ; //Prüfen auf End Of File
}
if ( ! fclose(fp)) // ungleich 0 -> Erfolg
printf(„Datei erfolgreich geschlossen“);
}
Peter Sobe Informatik I, Sommersem. 2011 12
High-Level-Zugriff: Zeichenweises Schreiben
In C wird mit fputc eine Datei zeichenweise geschrieben:
#include <stdio.h>
void main()
{
char c; FILE *fp;
fp = fopen(„c:\\dat.txt“,“w“);
c=‚A‘;
fputc(c,fp); //Schreiben Zeichen c
...........
fclose(fp); // EOF-Zeichen wird gesetzt
}
#include <stdio.h>
void main()
{ char c; FILE *fp;
char zeile[81]=„Das ist eine Zeile!“;
char *z=zeile;
fp = fopen(“c:\\dat.txt“,“w“);
fputs(z, fp); //Schreiben Zeile
...........
fclose(fp); // EOF wird gesetzt
}
#include <stdio.h>
void main()
{ char c; FILE *fp; int ao;
struct abt{char nr[5]; char nam[20]; char leit[7];} a;
fp = fopen(„c:\\dat.txt“,“r“);
ao=fscanf(fp,“%s%s%s“, a.nr,a.nam,a.leit);
//Lesen Anzahl von Objekten nr,nam,leit
// Rückkehrwert ao ist die Anzahl gelesener Obj.
// Rueckkehrwert –1 bei EOF
...........
fclose(fp); // EOF wird gesetzt
}
Peter Sobe Informatik I, Sommersem. 2011 18
Formatiertes Schreiben einer Datei
In C wird mit fprintf eine Datei formatiert geschrieben:
#include <stdio.h>
void main()
{ char c; FILE *fp; int ao;
struct abt{char nr[5]; char nam[20]; char leit[7];}
a={„111“,“Produktion“,“4531“};
fp = fopen(„c:\\dat.txt“,“w“);
ao=fprintf(fp,“%s%s%s“, a.nr,a.nam,a.leit);
//Schreiben von Objekten nr,nam,leit
// Rückkehrwert ao ist die Anzahl geschriebener Obj.
// Rueckkehrwert –1 bei EOF
...........
fclose(fp); // EOF wird gesetzt
}
Peter Sobe Informatik I, Sommersem. 2011 19
Beispiel:
unsigned d;
_dos_getdrive(&d); //ermittelt aktuelles LW
printf("Das aktuelle LW ist: %c\n", d + 'A' - 1);
Beispiel:
unsigned n;
_dos_setdrive(3,&n); //setzt aktuelles LW auf C
printf(„Es gibt insgesamt %d LW \n",n);
_finddata_t filesfound;
intptr_t f = _findfirst("C:\\TEMP\\*.*",&filesfound);
//Alle Dateien in C:\TEMP
if ( f != -1L ) {
do {
if ( !( filesfound.attrib & _A_SUBDIR ) )
{ //Verzeichnis ausschliessen
printf("%s %Iu\n",filesfound.name,filesfound.size);
}
} while ( _findnext(f,&filesfound)==0 ); //Nächste Datei
_findclose(f); //Handle schliessen
}
char pfad[30]=„c:\\temp\\neu“;
if (mkdir(pfad))
printf(„\nFehler!“);
else
printf(„\nOrdner erfolgreich erzeugt“);
char a[20]=„c:\\temp\\x.txt“;
char n[20]=„c:\\temp\\y.txt“;
// bei einem Ordner „texte“ würde der Pfad z.B. sein
// char a[20]=„c:\\temp\\texte“;
if (! rename(a,n)) printf(„\nFehler!“);
Gesperrte Dateien:
Die im Parameter angegebene Datei darf zu diesem
Zeitpunkt nicht in Nutzung sein, d.h. muss geschlossen
sein. Bei fehlerfreier Ausführung ist der Rückkehrwert 0,
sonst –1.
char datei[20]=„c:\\temp\\x.txt“;
if (! remove(datei)) printf(„\nFehler!“);
else printf(„\nDatei erfolgreich gelöscht“);
char ordner[20]=„c:\\temp\\texte“;
if (! rmdir(ordner)) printf(„\nFehler!“);
else printf(„\nOrdner erfolgreich gelöscht“);
Positionieren in Dateien
Die wichtigste Positionieroperation ist das Zurück-setzen einer
Datei an den Anfang: void rewind(FILE *fz);
Der Parameter anz gibt die Anzahl der Bytes relativ zu pos_mode
an, um die der Dateizeiger bewegt werden soll. Für pos_mode
gibt es nur drei Möglichkeiten:
0 für Dateianfang (Konstante SEEK_SET),
1 für aktuelle Position (Konstante SEEK_CURR) und
2 für Dateiende (SEEK_END).
Bei fehlerfreier Ausführung ist der Rückkehrw. 0, sonst ungleich 0.
Informatik I, Sommersem. 2011 30
Peter Sobe
Positionieren in Dateien
Beispiel:
fseek(fz, -10L, 1);
geöffnet. path ist dabei der Pfad- und Dateiname. Mit access werden
Zugriffsflags angegeben. Mit dem bit-weisen ODER können
folgende Konstanten gesetzt sein:
Das Lesen einer Bytefolge mit der Länge len von der Datei
mit dem Deskriptor file_descriptor wird mit der Funktion
int read(int file_descriptor, void buf, unsigned len)
ausgeführt, wobei die Bytefolge in den Hauptspeicher ab
der Adresse buf geschrieben wird. Der Rückkehrwert von
read ist die Anzahl der gelesenen Bytes:
nbytes = read(infile, rwbuf, 1024)
Im Fehlerfall ist der Rückkehr Wert –1.
Das Schreiben einer Bytefolge der Länge len wird mit der
Funktion
int write(int file_descriptor, void buf, unsigned len)
aufgerufen, wobei int file_descriptor das Handle auf die
Ausgabe-Datei darstellt (Dateideskriptor). Die zu
schreibende die Bytefolge wird dem Hauptspeicher ab der
Adresse buf entnommen. Der Rückkehrwert von write ist
die tatsächlich geschriebene Anzahl der Bytes.
Beispiel:
int wlen = write(outfile, wbuf, 1024) ;
Beispiel: