ein Kapitel zurück                                           ein Kapitel weiter

getc ist das Dateiorientierte Gegenstück zu getchar und dient dazu ein einzelnes Zeichen aus der Datei zu lesen. Mit getc sind wir also in der Lage Zeichen für Zeichen aus dem Stream zu lesen den wir mit fopen oder freopen (kommt noch), geöffnet haben. Sie erinnern sich doch noch, der FILE-Zeiger alias Stream!

Hier der Syntax zu getc....

int getc(FILE *datei);

Wir öffnen eine Datei zum lesen und wollen den Inhalt der Datei auf dem Bildschirm ausgeben. Als Rückgabewert erhalten sie das nächste Zeichen oder EOF bei Dateiende oder Fehler. Hier der Quellcode.....

/*Download:getc.c*/
/*getc.c*/ #include <stdio.h> int main() { int c; FILE *datei; datei=fopen("test.txt","r"); if(datei!=NULL) { while((c=getc(datei))!= EOF) putchar(c); } else printf("Konnte Datei nicht finden bzw. öffnen!\n"); return 0; }

Wir öffnen die Textdatei Namens test.txt im Lesemodus. Falls erfolgreich, wird der Text der Datei mit..

while((c=getc(datei))!= EOF)

...Zeichenweise Ausgelesen und mit putchar auf dem Bildschirm ausgegeben bis entweder ein Fehler Auftritt oder EOF zurückgegeben wird. Nun wollen wir das Programm etwas interaktiver machen....

/*Download:getc2.c*/
#include <stdio.h> int main() { FILE *datei; int c; char name[20]; printf("Welche Datei wollen sie wollen sie öffnen : "); gets(name); datei=fopen(name,"r"); if(datei!=NULL) { while((c=getc(datei))!= EOF) putchar(c); } else printf("Konnte %s nicht finden bzw. öffnen!\n",name); return 0; }

Somit ist es ist auch möglich den Namen eines Strings als 1.Parameter an fopen zu übergeben. Bitte beachten sie das sie die Datei mit der Richtigen Endung eingeben. Z.B. test.txt. Achten sie auch darauf das sie die richtige Pfadeingabe, falls nötig, eingeben. Nun wollen wir das ganze noch ein bisschen verbessern...

/*Download:getc3.c*/
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *datei; int c; if(argc<2) { printf("Bitte ein Datei laden mittels :\n"); printf("<Programmname> <Datei.xxx>\n"); exit (0); } else if((datei=fopen(argv[1],"r")) !=NULL) { while((c=getc(datei))!= EOF) putchar(c); } else printf("Konnte %s nicht finden bzw. öffnen!\n",argv[1]); return 0; }

Vorraussetzung das diese Programm eine Datei ladet ist natürlich das sie mit der Textkonsole arbeiten. Jetzt können sie Ihre Datei direkt beim Starten des Programms öffnen in dem sie als 2. Argument den Namen der zu öffnenden Datei übergeben.

Natürlich können sie mit getc auch von der Standardeingabe (stdin) lesen....

/*Download:getc4.c*/
#include <stdio.h> int main() { char text[4096]; int c; int i=0; printf("Bitte STRG+D drücken für EOF\n\n"); printf("Ihre Eingabe : "); while((c=getc(stdin)) != EOF) text[i++] = c; printf("\nSie gaben ein : %s\n",text); return 0; }

stdin ist ein Stream der von ANSI-C vorgeschrieben ist und steht für die Standardeingabe (meist von Tastatur). Nur werden sie in einem solchem Fall wahrscheinlich auf getchar zurückgreifen wollen.

Nun was bringt uns das Lesen ohne wieder etwas Schreiben zu können. Kommen wir als zu dem Gegenstück von getc.

putc

putc ist das Gegenstück zu putchar und sie können damit zeichenweiße in eine Datei schreiben. Der Syntax von putc lautet....

int putc(char quellen, FILE *ziel);

Mit putc schreiben sie also das Zeichen von quelle in den Stream ziel. Der Rückgabewert von putc ist das Zeichen in quelle oder bei Fehler EOF. Nun wollen wir unser Programm vom Kapitel zuvor erweitern...

/*Download:putc.c*/
#include <stdio.h> int main() { FILE *quelle, *ziel; int c; char nameq[20], namez[20]; printf("Name Quelldatei : "); gets(nameq); quelle=fopen(nameq,"rb"); if(quelle==NULL) { printf("Konnte %s nicht finden bzw. öffnen!\n",nameq); exit(0); } else { printf("Name Zieldatei : "); gets(namez); ziel=fopen(namez,"w+b"); if(ziel==NULL) { printf("Konnte Zieldatei nicht erzeugen!\n"); exit(0); } else { while((c=getc(quelle)) != EOF) putc(c,ziel); } } return 0; }

In diesem Fall benötigen wir zwei Dateien vom Typ FILE. Ein für die Datei zum öffnen und eine in der wir die geöffnete Datei schreiben....

FILE *quelle, *ziel;

Wir nennen sie einfacher halber quelle und ziel. Zuerst öffnen wir die wie schon im Kapitel zuvor eine Datei im "rb" - Modus (Lesen im Binärmodus). Anschließend werden wir gefragt wie wir die Zieldatei nennen wollen. Nach der Eingabe erzeugen wir falls die Zieldatei nicht schon existiert eine neue. Falls die Zieldatei schon existiert wird diese einfach überschrieben. Dies geschieht daher weil wir den Modus "w+" verwenden. Außerdem schreiben wir in die Datei im Binärmodus, daher der Modi "w+b" (die Tabelle der Modi finden sie im Kapitel fopen()) Unter Unix hat das 'b' für den Binärmodus keine Bedeutung.

ziel=fopen(namez,"w+b");

Anschließend überprüfen wir wie schon zuvor ob wir die Datei zum schreiben im Binärmodus öffnen konnten. Jetzt schreiben wir Zeichenweise mittels....

while((c=getc(quelle)) != EOF)
putc(c,ziel);

..von unserer Quelldatei in die Zieldatei. Nach Beendigung des Programms können sie sich davon überzeugen das sie von Ihrer Quelldatei ein Kopie gemacht mit dem Name den sie als Zieldatei verwendet haben.

Wollen wir doch mal ein Sinnvolles Beispiel ansehen. Jeder der an einer Webseite arbeitet, kennt das Problem. Tonnenweise Text muss ins HTML konvertiert werden. Wird z.B. einmal das Zeichen '<' vergessen ist der ganze Text teilweise ganz futsch. Wir wollen mittels putc und getc für Abhilfe schaffen. Es sollen alle Sonderzeichen ins HTML konvertiert werden. Folgende Regeln gelten dafür........



Ersetzen Sie das Zeichen ä durch die Zeichenfolge &auml;
Ersetzen Sie das Zeichen Ä durch die Zeichenfolge &Auml;
Ersetzen Sie das Zeichen ö durch die Zeichenfolge &ouml;
Ersetzen Sie das Zeichen Ö durch die Zeichenfolge &Ouml;
Ersetzen Sie das Zeichen ü durch die Zeichenfolge &uuml;
Ersetzen Sie das Zeichen Ü durch die Zeichenfolge &Uuml;
Ersetzen Sie das Zeichen ß durch die Zeichenfolge &szlig;
Ersetzen Sie das Zeichen < durch die Zeichenfolge &lt;
Ersetzen Sie das Zeichen > durch die Zeichenfolge &gt;
Ersetzen Sie das Zeichen & durch die Zeichenfolge &amp;
Ersetzen Sie das Zeichen " durch die Zeichenfolge &quot;

Mehr dazu können sie nachlesen unter SelfHtml8.0 von Stefan Münz. Hier der Quellcode dazu........

/*Download:t2html.c*/
#include <stdio.h> /* nchars = Anzahl der Zeichen */ /* tag = Sonderzeichen in HTML */ /* ziel = Datei in die geschrieben wird */ void sonderzeichen(int nchars, char *tag, FILE *ziel) { int i; char zeichen; for(i=0; i<nchars; i++){ zeichen=tag[i]; putc(zeichen, ziel); } } int main(int argc, char **argv) { FILE *q, *z; int zeichen; if(argc < 3) { printf("Benutzung : %s quelle ziel\n",*argv); exit(0); } q=fopen(argv[1], "r"); z=fopen(argv[2], "w"); if(q == NULL || z == NULL) { perror("Fehler"); exit(0); } while((zeichen=getc(q)) != EOF){ if(zeichen=='<') sonderzeichen(4,"&lt;", z); else if(zeichen=='>') sonderzeichen(4,"&gt;", z); else if(zeichen=='\"') sonderzeichen(6,"&quot;",z); else if(zeichen=='&') sonderzeichen(5,"&amp;",z); else if(zeichen=='ä') sonderzeichen(6 ,"&auml;",z); else if(zeichen=='Ä') sonderzeichen(6 ,"&Auml;",z); else if(zeichen=='ö') sonderzeichen(6 ,"&ouml;",z); else if(zeichen=='Ö') sonderzeichen(6 ,"&Ouml;",z); else if(zeichen=='ü') sonderzeichen(6 ,"&uuml;",z); else if(zeichen=='Ü') sonderzeichen(6 ,"&Uuml;",z); else if(zeichen=='ß') sonderzeichen(6 ,"&szlig;",z); else putc(zeichen, z); } return 0; }

Schon haben wir mit ein paar Zeilen Code einen Text2Html-Konverter in einer Light-Version.

Aufgabe
Schreiben sie das Programm oben so um, das man wie schon im Kapitel zuvor eine Kopie unserer Quelldatei mittels Eingabe in der Kommandozeile ....

kopie wichtig.txt

...machen kann. Die Kopie die sie davon machen soll sich im selben Verzeichnis mit dem Namen....

wichtig.bak

..befinden. Ich habe hier als Ziel eine Datei mit der Endung *.bak verwendet da dies meist so üblich ist (bak=backup). Das bleibt im Endeffekt Ihnen selbst überlassen welche Endung sie benutzen. Diese Methode ist übrigens ganz nützlich. Denn falls sie mal eine Datei erzeugen die den selben Namen einer bereits existierenden Datei im selben Verzeichnis. So können sie in Ihrem Programm so eine Testroutine einbauen und somit Automatisch eine Sicherheitskopie erzeugen. Hier geht's zur Lösung!

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf