Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
Vorwort des Gutachters
1 Einstieg in C
2 Das erste Programm
3 Grundlagen
4 Formatierte Ein-/Ausgabe mit »scanf()« und »printf()«
5 Basisdatentypen
6 Operatoren
7 Typumwandlung
8 Kontrollstrukturen
9 Funktionen
10 Präprozessor-Direktiven
11 Arrays
12 Zeiger (Pointer)
13 Kommandozeilenargumente
14 Dynamische Speicherverwaltung
15 Strukturen
16 Ein-/Ausgabe-Funktionen
17 Attribute von Dateien und das Arbeiten mit Verzeichnissen (nicht ANSI C)
18 Arbeiten mit variabel langen Argumentlisten – <stdarg.h>
19 Zeitroutinen
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
21 Dynamische Datenstrukturen
22 Algorithmen
23 CGI mit C
24 MySQL und C
25 Netzwerkprogrammierung und Cross–Plattform-Entwicklung
26 Paralleles Rechnen
27 Sicheres Programmieren
28 Wie geht’s jetzt weiter?
A Operatoren
B Die C-Standard-Bibliothek
Stichwort

Jetzt Buch bestellen
Ihre Meinung?

Spacer
<< zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch
Buch: C von A bis Z

C von A bis Z
3., aktualisierte und erweiterte Auflage, geb., mit CD und Referenzkarte
1.190 S., 39,90 Euro
Rheinwerk Computing
ISBN 978-3-8362-1411-7
Pfeil 16 Ein-/Ausgabe-Funktionen
Pfeil 16.1 Was ist eine Datei?
Pfeil 16.2 Formatierte und unformatierte Ein-/Ausgabe
Pfeil 16.3 Standard-Streams
Pfeil 16.4 Höhere Ein-/Ausgabe-Funktionen
Pfeil 16.5 Datei (Stream) öffnen – »fopen«
Pfeil 16.5.1 Modus für »fopen()«
Pfeil 16.5.2 Maximale Anzahl geöffneter Dateien – »FOPEN_MAX«
Pfeil 16.6 Zeichenweise lesen und schreiben – »getchar()« und »putchar()«
Pfeil 16.6.1 Ein etwas portableres »getch()«
Pfeil 16.7 Zeichenweise lesen und schreiben – »putc()«/»fputc()« und »getc()«/»fgetc()«
Pfeil 16.8 Datei (Stream) schließen – »fclose()«
Pfeil 16.9 Formatiertes Einlesen/Ausgeben von Streams mit »fprintf()« und »fscanf()«
Pfeil 16.10 Standard-Streams in C
Pfeil 16.10.1 Standard-Streams umleiten
Pfeil 16.11 Fehlerbehandlung von Streams – »feof()«, »ferror()« und »clearerr()«
Pfeil 16.12 Gelesenes Zeichen in die Eingabe zurückschieben – »ungetc()«
Pfeil 16.13 (Tastatur-)Puffer leeren – »fflush()«
Pfeil 16.14 Stream positionieren – »fseek()«, »rewind()« und »ftell()«
Pfeil 16.15 Stream positionieren – »fsetpos()«, »fgetpos()«
Pfeil 16.16 Zeilenweise Ein-/Ausgabe von Streams
Pfeil 16.16.1 Zeilenweise lesen mit »gets()«/»fgets()«
Pfeil 16.16.2 Zeilenweise schreiben mit »puts()«/»fputs()«
Pfeil 16.16.3 Zeilenweise vom Stream einlesen mit »getline()« (nicht ANSI C)
Pfeil 16.16.4 Rezepte für zeilenweises Einlesen und Ausgeben
Pfeil 16.17 Blockweise lesen und schreiben – »fread()« und »fwrite()«
Pfeil 16.17.1 Blockweise lesen – »fread()«
Pfeil 16.17.2 Blockweise schreiben – »fwrite()«
Pfeil 16.17.3 Big Endian und Little Endian
Pfeil 16.18 Datei (Stream) erneut öffnen – »freopen()«
Pfeil 16.19 Datei löschen oder umbenennen – »remove()« und »rename()«
Pfeil 16.19.1 remove()
Pfeil 16.19.2 rename()
Pfeil 16.20 Pufferung einstellen – »setbuf()« und »setvbuf()«
Pfeil 16.20.1 Die Funktion »setbuf()«
Pfeil 16.20.2 Die Funktion »setvbuf()«
Pfeil 16.21 Temporäre Dateien erzeugen – »tmpfile()« und »tmpnam()«
Pfeil 16.21.1 »mkstemp()« – sichere Alternative für Linux/UNIX (nicht ANSI C)
Pfeil 16.22 Fehlerbehandlung
Pfeil 16.22.1 Fehlerausgabe mit »perror()«
Pfeil 16.22.2 Fehlerausgabe mit »strerror()«
Pfeil 16.23 Formatiert in einen String schreiben und formatiert aus einem String lesen – »sscanf()« und »sprintf()«
Pfeil 16.24 Byte- und wide-orientierter Stream
Pfeil 16.25 Ein fortgeschrittenes Thema
Pfeil 16.26 Low-Level-Datei-I/O-Funktionen (nicht ANSI C)
Pfeil 16.26.1 Datei öffnen – »open()«
Pfeil 16.26.2 Datei schließen – »close()«
Pfeil 16.26.3 Datei erzeugen – »creat()«
Pfeil 16.26.4 Schreiben und Lesen – »write()« und »read()«
Pfeil 16.26.5 File-Deskriptor positionieren – »lseek()«
Pfeil 16.26.6 File-Deskriptor von einem Stream – »fileno()«
Pfeil 16.26.7 Stream von File-Deskriptor – »fdopen()«


Rheinwerk Computing - Zum Seitenanfang

16.7 Zeichenweise lesen und schreiben – »putc()«/»fputc()« und »getc()«/»fgetc()« topZur vorigen Überschrift

Die Funktionen getc() und fgetc() sind das dateiorientierte Gegenstück zu getchar(). Sie werden verwendet, um einzelne Zeichen aus einem Stream zu lesen, der zuvor mit fopen() geöffnet wurde. Der Unterschied zwischen getc() und fgetc() besteht darin, dass fgetc() als eine Funktion implementiert ist und getc() ein Makro sein darf. Hier sehen Sie die Syntax dazu:

#include <stdio.h>

int getc(FILE *datei);
int fgetc(FILE *datei);

Folgende beiden Schreibweisen sind dabei identisch:

// Liest ein Zeichen aus der Standardeingabe.
getchar();

// Liest ebenfalls ein Zeichen aus der Standardeingabe.
fgetc(stdin);

Dazu folgt ein Listing, das eine Datei zum Lesen öffnet und anschließend den Inhalt der Datei Zeichen für Zeichen auf dem Bildschirm ausgibt. Eingelesen wird so lange, bis das Zeichen für Dateiende oder Fehler erreicht wird (EOF).

/* fgetc1.c */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   int c;
   FILE *datei;

   datei=fopen("test.txt", "r");
   if(datei != NULL) {
      while( (c=fgetc(datei)) != EOF)
         putchar(c);
   }
   else {
      printf("Konnte Datei nicht finden bzw. öffnen!\n");
      return EXIT_FAILURE;
   }
   return EXIT_SUCCESS;
}

Bei diesem Programm wird zuerst versucht, eine Textdatei im Lesemodus zu öffnen. Falls dies gelungen ist, wird der Text zeichenweise ausgelesen mit

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

und mit putchar() zeichenweise auf dem Bildschirm ausgegeben, bis ein Fehler oder EOF auftritt. Das Programm soll nun ein wenig erweitert werden:

/* fgetc2.c */
#include <stdio.h>
#include <stdlib.h>

void read_char(FILE *stream) {
   int c;

   while( (c=fgetc(stream)) !=EOF)
      putchar(c);
}

int main(int argc, char **argv) {
   FILE *datei;
   char filename[255];

   /* Falls die Datei zum Öffnen nicht
    * als Argument übergeben wurde ... */
   if(argc < 2) {
      printf("Welche Datei wollen Sie öffnen : ");
      scanf("%s",filename);
      datei = fopen(filename ,"r");
      if(datei != NULL)
         read_char(datei);
      else {
         printf("Fehler beim Öffnen von %s\n",filename);
         return EXIT_FAILURE;
      }
   }
   else {
      datei=fopen(argv[1],"r");
      if(datei != NULL)
         read_char(datei);
      else {
         printf("Konnte %s nicht öffnen!\n",argv[1]);
         return EXIT_FAILURE;
      }
   }
   return EXIT_SUCCESS;
}

In diesem Beispiel kann die Datei, die es zu öffnen gilt, entweder über die Kommandozeile eingegeben werden oder erst nach dem Start des Programms. Es empfiehlt sich, diese Schreibweise allgemein für Konsolenprogramme zu verwenden. Damit ist zumindest sichergestellt, dass auch Anwender, die mit dem Programm nicht vertraut sind, es bedienen können.

Als Nächstes betrachten wir das Gegenstück der Funktionen getc() und fgetc(). Für die beiden Funktionen putc() und fputc() gilt hinsichtlich ihres Unterschieds dasselbe wie bei getc() und fgetc(). fputc() ist somit als Funktion implementiert, und putc() darf ein Makro sein. Mit putc()/fputc() kann zeichenweise in einen Stream geschrieben werden. Die Syntax dieser Funktionen lautet:

#include <stdio.h>

int putc(int quelle, FILE *ziel);
int fputc(int quelle, FILE *ziel) ;

Damit wird das Zeichen quelle in den Stream ziel geschrieben. Der Rückgabewert ist das Zeichen in quelle oder bei einem Fehler bzw. am Dateiende EOF.

Dazu ein Listing, mit dem Sie eine Datei zeichenweise kopieren können:

/* copy_char4char.c */
#include <stdio.h>
#include <stdlib.h>

int main(void) {
   FILE *quelle, *ziel;
   int c;
   char name_q[255], name_z[255];

   printf("Name der Quelldatei : ");
   scanf("%s",name_q);
   quelle=fopen(name_q,"rb");
   if(quelle == NULL) {
      printf("Konnte %s nicht finden bzw. öffnen!\n",name_q);
      return EXIT_FAILURE;
   }
   else {
      printf("Name der Zieldatei : ");
      scanf("%s",name_z);
      ziel=fopen(name_z,"w+b");
      if(ziel==NULL)  {
         printf("Konnte Zieldatei nicht erzeugen!\n");
         return EXIT_FAILURE;
      }
      else {
         /* Wir kopieren zeichenweise von quelle nach ziel. */
         while( (c=getc(quelle)) != EOF)
            putc(c,ziel);
      }
   }
   return EXIT_SUCCESS;
}

In diesem Beispiel werden zwei Streams verwendet – einer, mit dem die Datei geöffnet wird, um daraus zu lesen, und ein zweiter, mit dem in eine weitere geöffnete Datei geschrieben wird:

FILE *quelle, *ziel;

Passend werden diese Streams quelle und ziel benannt. Zuerst wird eine Datei zum Lesen im "rb"-Modus geöffnet. Anschließend erfolgt eine Abfrage, wie die Zieldatei heißen soll. Falls die Zieldatei nicht existiert, wird diese erzeugt. Andernfalls wird diese Datei einfach überschrieben, da der Modus "w+" verwendet wurde. Hier wird außerdem der binäre Modus eingesetzt, da der Inhalt in diesem Fall beim Kopieren nicht von Interesse ist. Unter UNIX/Linux hat das b für den Binärmodus keine Bedeutung und wird somit ignoriert:

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

Anschließend wird überprüft, ob die Datei zum Schreiben im Binärmodus geöffnet werden konnte. Danach kann zeichenweise von der Quelldatei gelesen und in die Zieldatei geschrieben werden:

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

Wenn alles problemlos verlaufen ist, wurde eine exakte Kopie der Quelldatei erstellt – mit dem Namen, der als Zieldatei angegeben wurde.

Dazu ein weiteres Beispiel, wann eine zeichenweise Abarbeitung von Daten sinnvoller erscheint. Jeder, der an einer Webseite arbeitet, kennt das Problem: Viel Text muss ins HTML-Format konvertiert werden. Wird dabei einmal das Zeichen '<' vergessen, das ein HTML-Tag einleitet, ist manchmal der vollständige Text bis zum nächsten mit '>' schließenden Tag futsch.

Das folgende Programm soll alle Sonderzeichen in das HTML-Format konvertieren. Folgende Regeln gelten:

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

Der Quellcode dazu lautet:

/* txt2html_example.c */
#include <stdio.h>
#include <stdlib.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);
      return EXIT_FAILURE;
   }

   q = fopen(argv[1], "r");
   z = fopen(argv[2], "w");
   if(q == NULL || z == NULL) {
      printf("Fehler bei Oeffnen einer Datei ...\n");
      return EXIT_FAILURE;
   }
   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 EXIT_SUCCESS;
}

Schon haben Sie mit ein paar Zeilen Code die Light-Version eines Text2Html-Konverters geschrieben.

Natürlich gibt es auch bei den byte-orientierten Funktionen fgetc/getc bzw. fputc/putc die Gegenstücke für breite Zeichen. Die Syntax dazu lautet:

#include <wchar.h>
// Breite Zeichen lesen
wint_t fgetwc( FILE *fp );
wint_t getwc( FILE *fp );
// Breite Zeichen schreiben
wint_t fputwc( wchar_t wc, FILE *fp );
wint_t putwc( wchar_t wc, FILE *fp );

Ansonsten gilt für die breiten Gegenstücke dasselbe, was ich schon zuvor bei den Funktionen getwchar() und putwchar() gesagt habe.



Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

<< zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: C/C++






 C/C++


Zum Rheinwerk-Shop: Einstieg in C






 Einstieg in C


Zum Rheinwerk-Shop: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Rheinwerk-Shop: C++ Handbuch






 C++ Handbuch


Zum Rheinwerk-Shop: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo




Copyright © Rheinwerk Verlag GmbH 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern