C-Dateiverarbeitung: fopen, Strukturen und Zeichenfilter

Informatik5,74 KB

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);

  1. Variable, die die Daten enthält: &alumno1
  2. Anzahl der Bytes, die in die Datei geschrieben werden: sizeof(struct reg_alumno) (die sizeof-Funktion gibt die Anzahl der Bytes eines Datentyps an)
  3. Anzahl der Elemente: 1
  4. 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.

Herunterladen

PDF Word HTML