C-Dateiverarbeitung: fopen, Strukturen und Zeichenfilter
Dateiverarbeitung in C
Der Datentyp FILE * dient der Dateiverarbeitung. Die Funktion fopen öffnet oder erstellt eine Datei physisch: Fich = fopen("Dateiname", "mode");
Öffnungsmodi
- "r": Lesen
- "w": Schreiben
- "a": Anhängen
- "+": Lesen und Schreiben (Ergänzung)
Grundlegende Funktionen
- fclose(tab): Schließt die Datei.
- getc(tab): Liest ein Zeichen aus der Datei.
- fgets(string, Länge bzw. Größe, Fich): Liest eine Zeile.
- putc(Zeichen, Karten): Schreibt ein Zeichen in die Datei.
- fputs(string, Karten): Schreibt eine Zeichenkette in die Datei.
- feof: Prüft das Dateiende (EOF: End Of File).
- rewind(TAB): Setzt den Dateizeiger an den Anfang zurück.
Strukturen und Dateizugriff
Es werden Variablen vom Typ einer Struktur erstellt: struct reg_alumno alumno1;
Zugriff auf Felder mit Punkt-Notation, z. B. alumno1.edad, oder mit Pfeil-Notation (bei Zeigern), z. B. alumno1->edad.
Beispiel: fwrite
fwrite(&alumno1, sizeof(struct reg_alumno), 1, Karten);
- Variable, die die Daten enthält:
&alumno1 - Anzahl der Bytes, die in die Datei geschrieben werden:
sizeof(struct reg_alumno)(die sizeof-Funktion gibt die Anzahl der Bytes eines Datentyps an) - Anzahl der Elemente:
1 - Datei, in die geschrieben wird:
Karten
Beispiel: fread
Die Funktion fread hat 4 Parameter: fread(&alumno1, sizeof(struct reg_alumno), 1, Karten);
Definition der Struktur
struct reg_alumno {
char nombre[12];
char apellido[25];
int edad;
float notamedia;
};Auswahlmenü mit switch
int opcion;
switch (opcion) {
case 1:
printf("Nummer 1");
break;
}Zeichen aus einer Zeichenkette löschen
Die Funktion funcionborrarpos entfernt alle Vorkommen des Zeichens Elim aus der Zeichenkette str, indem die nachfolgenden Zeichen nach links verschoben werden:
int funcionborrarpos(char str[20], char Elim) {
int i;
printf("\nIn der Funktion");
for (i = 0; str[i] != '\0'; i++) {
if (str[i] == Elim) {
while (str[i] != '\0') {
str[i] = str[i + 1];
i++;
}
}
}
printf("\n%s", str);
getch();
return 0;
}Hinweis: Die Schleife prüft nach dem Verschieben die Position erneut, damit aufeinanderfolgende Vorkommen ebenfalls entfernt werden. Die Ausgabe nutzt %s, da die gesamte Zeichenkette ausgegeben werden soll.
Dateien nach Zeichentyp aufteilen
Das Programmbeispiel öffnet eine Datei und erstellt drei neue Dateien: mayusculas.txt (Großbuchstaben), minusculas.txt (Kleinbuchstaben) und numeros.txt (Ziffern).
void mayusculas(FILE *fp) {
char letra;
FILE *fmayus = fopen("mayusculas.txt", "w");
rewind(fp);
if (fmayus == NULL) {
printf("\nError in mayusculas.txt");
} else {
printf("\nArchivo mayusculas.txt abierto");
letra = getc(fp);
while (!feof(fp)) {
if (letra >= 'A' && letra <= 'Z')
putc(letra, fmayus);
letra = getc(fp);
}
fclose(fmayus);
}
}Hinweis: Für Kleinbuchstaben muss der Bereich 'a' bis 'z' geprüft werden, nicht 'A' bis 'z'. Für Ziffern gilt der Bereich '0' bis '9'.
void minusculas(FILE *fp) {
char letra;
FILE *fminus = fopen("minusculas.txt", "w");
rewind(fp);
if (fminus == NULL) {
printf("\nError in minusculas.txt");
} else {
printf("\nArchivo minusculas.txt abierto");
letra = getc(fp);
while (!feof(fp)) {
if (letra >= 'a' && letra <= 'z')
putc(letra, fminus);
letra = getc(fp);
}
fclose(fminus);
}
}
void numeros(FILE *fp) {
char letra;
FILE *fnum = fopen("numeros.txt", "w");
rewind(fp);
if (fnum == NULL) {
printf("\nError in numeros.txt");
} else {
printf("\nArchivo numeros.txt abierto");
letra = getc(fp);
while (!feof(fp)) {
if (letra >= '0' && letra <= '9')
putc(letra, fnum);
letra = getc(fp);
}
fclose(fnum);
}
}Hauptprogramm
int main() {
char nombre[25];
printf("\nSeparar mayusculas, minusculas y numeros:");
printf("\n--");
printf("\nIngrese el nombre del archivo que desea abrir (con la extension):\n-> ");
gets(nombre);
FILE *fp = fopen(nombre, "r");
if (fp == NULL) {
printf("\nError al abrir el archivo");
} else {
printf("\nArchivo abierto correctamente");
printf("\n---");
mayusculas(fp);
minusculas(fp);
numeros(fp);
fclose(fp);
}
getch();
return 0;
}Hinweis: Die Funktion gets ist veraltet und sollte durch fgets ersetzt werden. Außerdem sollte nach dem Öffnen geprüft werden, ob die Datei überhaupt vorhanden ist, bevor weitere Operationen ausgeführt werden.