8. Strukturen und Dateien Strukturen und Dateien

8. Strukturen und Dateien Strukturen und Dateien ___________________________________________________________________________________________________...
Author: Daniel Dieter
5 downloads 6 Views 243KB Size
8. Strukturen und Dateien

Strukturen und Dateien

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-1

8. Strukturen und Dateien

Strukturierte Datenobjekte,

die in C zur Verfügung

stehen, heißen Strukturen (records) und ►



Unions

Definition: Eine Struktur (struct) implementiert ein heterogenes Feld, das aus mehreren Komponeten unterschiedlicher Typen und unterschiedlicher Größe besteht. Beispiel: struct erste_struktur nr

bezeichnung

preis

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-2

8. Strukturen und Dateien

Definition im Programm besteht aus der ► Deklaration der sog. Schablone der Struktur und der ► Definition von konkreten Strukturen (strukt. Variablen). Beispiel: Deklaration der Schablone der Struktur erste_struktur : struct erste_struktur { int nr; char bezeichnung[16]; double preis; } Definition der Strukturen vom Typ: erste_struktur : struct erste_struktur REC1, REC2, HILF; ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-3

8. Strukturen und Dateien

Definition kann auch gemeinsam (in einem Schritt) ausgeführt werden: struct erste_struktur { int nr; char bezeichnung[16]; double preis; } REC1, REC2, HILF;

Syntax der Deklaration: struct [] { Deklaration der Komponente1; Deklaration der Komponente2; . . . ; } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-4

8. Strukturen und Dateien

Strukturen können auch mit Initialisierung definiert werden: struct person { int p_zahl; char nachname[12]; char vorname[10]; int geburtsjahr; . . . } ; struct person P1 = {2483,"MEYER","Karl",1953,…}, P2 = {4417,"BROD","Max",1969,…}, P3 = {3659,"KLANG","Ute",1978,…}; ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-5

8. Strukturen und Dateien

Zugriff zu den Komponenten 1. Punkt – Notation: P1.p_zahl = 2483; strcpy(P1.nachname, "MEYER"); strcpy(P1.vorname, "Karl"); P1.geburtsjahr = 1953; . . . 2. Über Zeiger: struct person *pP1; . . . (*pP1).p_zahl = 2483; strcpy((*pP1).nachname, "MEYER"); . . . ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-6

8. Strukturen und Dateien

3. Über Zeiger, mit „->“ Notation: struct person *pP1, *pP2, *pP3; . . . pP1->p_zahl = 2483; strcpy(pP1->nachname, "MEYER"); strcpy(pP1->vorname, "Karl"); pP1->p_zahl = 1953; . . . pP3->p_zahl = 3659; strcpy(pP3->nachname, "KLANG"); strcpy(pP3->nachname, "Ute"); pP3->p_zahl = 1978; . . . ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-7

8. Strukturen und Dateien

Verwendung von Strukturen /* Programm C13_1.c – Demonstration von Strukturen */ # include # include struct person {

/* Struktur deklarieren */

char name [31]; char vorname [21]; char geburtsdatum [9]; char geschlecht;

/* Format JJJJMMTT */ /* W | M */

unsigned int kundennummer; }; void main ( ) { struct person kunde;

/* Variable definieren */

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-8

8. Strukturen und Dateien strcpy ( kunde . name , "Mayerhofer" );

/* Werte zuweisen */

strcpy ( kunde . vorname , "Dietmar" ); strcpy ( kunde . geburtsdatum , "19621023" ); kunde . geschlecht = 'M' ; kunde . kundennummer = 4711 ; printf (" \n Name

: %s ", kunde . name ) ;

printf (" \n Vorname

: %s ", kunde . vorname );

/* Auf Struktur */ /* zugreifen */

printf (" \n Geburtsdatum: %s ", kunde . geburtsdatum ) ; printf (" \n Geschlecht

: %c ", kunde . geschlecht ) ;

printf (" \n Kundennummer: %i ", kunde . kundennummer ) ; printf (" \n\n " ); printf (" \n 1.Buchstaben: %c", kunde . vorname [0] ) ; printf (" %c ; ", kunde . name [0] ); printf (" Geschlecht = %s ", ( kunde . geschlecht == 'W' ) ? "weiblich" : "männlich") ; printf ( " \n\n " ) ; } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-9

8. Strukturen und Dateien /* Programm C13_1b.c – Demonstration der Zuweisung von Strukturen */ # include main ( ) { struct { char name [30] ; int alter ; } a, b; strcpy (a . name, "Mayerhofer Kurt" ) ; a . alter = 21 ; b = a; printf ( "\n Komponente b . name = %s ", b . name ) ; printf ( "\n Komponente b . alter = %i ", b . alter ) ; printf ( "\n\n" ) ; } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-10

8. Strukturen und Dateien

Beispiel: Funktion für den Vertausch von Komponenten: #include void tauschen (struct koor*);

/* Funktions-Prototyp

*/

struct koor { /* Deklaration der Struktur-Schablone double xk; /* zwei Gleitkommakomponenten double yk; }; struct koor position = {12.34, 43.21}; /* Definition

*/ */

*/

void main() { printf("\nVorher %.2lf %.2lf", position.xk, position.yk); tauschen (&position); printf("\nNachher %.2lf %.2lf", position.xk,position.yk); } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-11

8. Strukturen und Dateien void tauschen (struct koor *werte) { double hilf; hilf = werte->xk; werte->xk = werte->yk; werte->yk = hilf; }

Ausgaben: Vorher 12.34 43.21 Nachher 43.21 12.34

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-12

8. Strukturen und Dateien

Merkmale des Zugriffs zu den Strukturen Verweisungen auf die Strukturen und ihre Komponenten Gegeben sei eine einfache Struktur: struct ein int x; int *y; } *P; /*

{ /* ganzzahlige Komponente */ /* Zeiger auf ganzzahl. Variable */ /* Zugriff über den Zeiger P */

Dynamische Erzeugung der Struktur

*/

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-13

8. Strukturen und Dateien

Dann können folgende Zugriffe verwendet werden: ++P->x; /* inkrementiert x vorm Zugriff (++P)->x; /* inkr. P vorm Zugriff zu x P->x++; /* inkrementiert x nach dem Zugriff P++->x; /* inkr. P nach dem Zugriff zu x *P->y; /* liefert Inhalt des Speicher/* platzes, auf den y verweist *P->y++; /* inkrementiert y nach dem Zugriff /* zum Speicherplatz, auf den y verweist (*P->y)++; /* inkrementiert Inhalt des Spei/* cherplatzes, auf den y verweist *P++->y; /* inkrementiert P nach dem Zugriff /* zum Speicherplatz, auf den y verweist

*/ */ */ */ */ */ */ */ */ */ */ */

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-14

8. Strukturen und Dateien

Verwendung von typedef : Syntax: typedef ; Beispiel: . . . typedef unsigned short KURZ; main() { KURZ var1 = 135; . . . printf("%u", var1); . . . } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-15

8. Strukturen und Dateien

Beispiel: . . . typedef struct { char name [31]; char vorname [21]; char geburtsdatum [9]; char geschlecht; unsigned int kundennummer; } person;

/*

Struktur deklarieren

*/

/*

*/ */

Format JJJJMMTT /* W | M

void main() { int i, j; person X, Y; /* Definition von zwei lokalen Strukturen */ . . . ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-16

8. Strukturen und Dateien

Beispiel: typedef struct { int warennr; char warenname[20]; float einzelpreis; . . .

}

item;

void main() { item W1, W2, *pW; . . .

W1.warennr = 4711; strcpy (W1.warenname, "Plotter"); . . .

pW->warennr = 6552; strcpy (pW->warenname, "Drucker"); . . . ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-17

8. Strukturen und Dateien

Unions Unions sind spezielle Formen von Strukturen – Komponenten einer Union liegen „übereinander“, d.h. der Speicherplatz für jede Komponente der Union fängt an der gleichen Stelle (Adresse) an und immer nur eine der Komponenten kann gespeichert werden (eine momentan gespeicherte Komponente überschreibt die vorhergehende).

Syntax: union [] { Deklaration der Komponente1; Deklaration der Komponente2; . . . ; } []; ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-18

8. Strukturen und Dateien

Beispiel: union { int ganzzahl; char name[10]; } U1;

Abspeicherung: union U1 ganzzahl name

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-19

8. Strukturen und Dateien

Zuweisungen: strcpy (U1.name, "Schneider"); U1.ganzzahl = 1040; Inhalt der Union nach der Zuweisung strcpy (U1.name, "Schneider"); union U1

S

c

h

n

e

i

d

e

r

\0

Inhalt der Union nach der Zuweisung U1.ganzzahl = 1040; union U1

00 00 04 10

e

i

d

e

r

\0

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-20

8. Strukturen und Dateien

Verwendung von Unions /* Programm C13_3.c - Ausgabe int in hexa (Funktion outih(x)) */ #include void outih (short); /* Funktionsprototyp */ int main (void) { int eingabe; /* Variablen definieren */ char c; printf ("\n\t\t Ausgabe von INT Zahlen im Hexa-Zahlensystem"); printf ("\n\n Die integer-Zahl eingeben (mit '0' beenden): "); scanf ("%i", &eingabe); /* Zahl eingeben */ while (eingabe != 0) { printf (" Die Zahl %i ist in Hexa: ", eingabe); outih ((short)eingabe); /* Ausgabe in Hexa */ printf ("\n Die integer-Zahl eingeben (mit '0' beenden):"); scanf ("%i", &eingabe); } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-21

8. Strukturen und Dateien printf ("\n\n"); return (0); } void outih (short x) { union { unsigned short num; /* 16 bit integer unsigned char s[2]; /* array of hexa-characters } val; char *p = "0123456789abcdef"; /* list of hexa-characters val.num putchar putchar putchar putchar putchar

= x; (p[val.s[0] (p[val.s[0] (p[val.s[1] (p[val.s[1] ('\n');

>> 4]); & 15]); >> 4]); & 15]);

/* converted short value /* high byte conversion /*

low byte conversion

*/ */ */ */ */ */

} ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-22

8. Strukturen und Dateien

Zusammenfassung (Strukturen und Unions) ► Strukturen vereinfachen das Programmieren dadurch, dass sie zusammengehörenden Daten unter einem Variablennamen zusammenfassen. ► Strukturmitglieder (Komponenten) können nicht die Speicherklassen register, static oder void haben. ► Durch Zuweisung einer Struktur zu einer anderen können Arrays verdoppelt werden, was sonst nur mit der Funktion strcpy möglich ist. ► Strukturen können geschachtelt werden. Das heisst, in einer Struktur können wiederum andere Strukturen oder Unions erscheinen. ► Die Gesamtlänge einer Union ist gleich der Länge des größten Mitglieds (Komponente) dieser Union. ► Unions weden häufig eingesetzt, wenn innerhalb einer Struktur ein bestimmter Speicherbereich unterschiedliche Daten aufnehmen soll; diese Technik spart wertvollen Speicherplatz. ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-23

8. Strukturen und Dateien

Dateien (Files) ► Datenstrukturen, die auf den externen Speichermedien gespeichert werden können. ► Sie ermöglichen effiziente Abspeicherung von großen Datenmengen. ► Sie besitzen verschiedene interne Organisationen. ► Sie werden mit speziellen Ein-/Ausgabeoperationen (Funktionen) behandelt: – – – – –

Definition der Datei Öffnen der Datei Lesen vo Daten Schreiben (Abspeichern) von Daten Schliessen der Datei

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-24

8. Strukturen und Dateien

Vordefinerter Datentyp FILE: typedef struct { int level; /* fill/empty level of buffer unsigned flags; /* file status flags char fd; /* file descriptor unsigned char hold; /* ungetc char if no buffer int bsize; /* buffer size unsigned char *buffer; /* data transfer buffer unsigned char *curp; /* current active pointer unsigned istemp; /* temporary file indicator short token; /* used for validity checking } FILE; /* this is the FILE object

*/ */ */ */ */ */ */ */ */ */

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-25

8. Strukturen und Dateien

Funktionen für die Bearbeitung von Dateien: Datei definieren: FILE

*fp, *fp2, *fopen();

fp, fp2 sind Dateizeiger, über die die Dateien zugegriffen werden können fopen ist ein Prototyp der Funktion zum Öffnen der Datei

Datei öffnen: = fopen(, ); Modus: "r"

"w"

"a"

fp = fopen("abc.txt", "r"); fp2 = fopen("xyz.dat", "w");

Ein Zeichen von der Datei lesen: c = fgetc(fp); ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-26

8. Strukturen und Dateien

Ein Zeichen auf die Datei schreiben (aufzeichnen): fputc(c,fp);

Ein record (struct) lesen: fscanf(, , ); fscanf(fp, "%i %s %lf", pW->nr, pW->name, pW->preis);

Ein record aufzeichnen: fprintf(, , ); fprintf(fp, "%5i %s %8.2lf", pW->nr, pW->name, pW->preis);

Eine Textzeile lesen: fgets(, , ); fgets(pW->name, 20, fp); ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-27

8. Strukturen und Dateien

Eine Textzeile aufzeichnen: fputs(, ); fputs(pW->name, fp);

Datei schliessen: fclose(fp);

Beispiel: main () { FILE *datei_ptr; datei_ptr = fopen ("abc.txt", "w"); if (datei_ptr != NULL) { fputs (pW->name, datei_ptr); fclose(datei_ptr); } } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-28

8. Strukturen und Dateien /* Programm C11_1.c – Demonstration des Kopierens einer Textdatei */ # include main ( )

{

char c; int count = 0; FILE *fopen ( ), *fr, *fw; fr = fopen ( "x.txt", "r" ); fw = fopen ( "y.txt", "w" ); while ( ( c = fgetc ( fr ) ) != EOF ) { count ++ ; fputc (c, fw); putchar (c); } printf ("\n Insgesamt %i Zeichen wurden kopiert \n\n", count); fclose ( fr ) ; fclose ( fw ) ; } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-29

8. Strukturen und Dateien /* Programm C11_1a.c – Demonstration des Kopierens einer Textdatei */ # include main ( int argc, char *argv [ ] ) { char c; int count = 0; FILE *fopen ( ), *fr, *fw; if ( argc < 2 )

{

/* ist kein Parameter vorhanden ? */

printf ("\n Kein Kommandozeilen-Parameter gefunden ! \n"); exit ( 1 ) ; } if ( argc == 2 )

{

/* nur ein Dateiname eingegeben */

printf ("\n Nur eine Datei eingegeben ! \n"); exit ( 1 ) ; } ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-30

8. Strukturen und Dateien fr = fopen ( argv [1] , "r" ) ; fw = fopen ( argv [2] , "w") ; while ( ( c = fgetc ( fr ) ) != EOF )

{

count ++ ; fputc (c, fw); putchar (c); } printf ("\n Insgesamt %i Zeichen wurden kopiert \n\n", count); fclose ( fr ) ; fclose ( fw ) ; }

________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-31

8. Strukturen und Dateien # include # include # define N

5

# define LS 5 typedef struct dat_satz { int num; char name[LS]; float e_preis; int anzahl; float ges_preis; } item; int main ( void ) { int i, j; item TAB[N], BUFFER; FILE *f, *fopen ( ) ; ________________________________________________________________________________________________________________________________ V. Matoušek: Informationsverarbeitung / FH Regensburg 8-32

8. Strukturen und Dateien f = fopen ( "file1.dat", "r" ) ; printf ("\n Eingabe: \n"); i = 0; while (fscanf (f,"%d %s %f %d %f\n", &TAB[i].num, &TAB[i].name, &TAB[i].e_preis, &TAB[i].anzahl, &TAB[i].ges_preis) != EOF) { i++; printf (" Der %d. Datensatz wurde eingelesen \n", i); }

fclose ( f ) ; f = fopen ( "file2.dat", "w" ) ; for ( i=0; i