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.14 Stream positionieren – »fseek()«, »rewind()« und »ftell()« topZur vorigen Überschrift

Wenn Sie eine Datei öffnen, verweist ein Indikator für die Dateiposition (genauer gesagt der Schreib-/Lesezeiger) auf den Anfang der Datei, genauer gesagt auf das erste Zeichen mit der Position 0. Sie können sich dies gern wie bei einem gewöhnlichen char-Array vorstellen, wo jedes Zeichen an einer bestimmten Position ist. Nur dann, wenn Sie eine Datei im Anhängemodus (a bzw. a+) öffnen, verweist der Schreib-/Lesezeiger auf das Ende der Datei. Mit jeder Lese- oder Schreiboperation erhöht sich auch der Schreib-/Lesezeiger um die Anzahl der übertragenen Zeichen. Wenn Sie diesen sequenziellen Arbeitsfluss von Dateien ändern wollen, müssen Sie Funktionen für einen wahlfreien Dateizugriff verwenden. Hierfür stehen die Funktionen fseek(), rewind() und fsetpos() zur Verfügung.


Hinweis

Es ist nicht möglich, bei allen Arten von Dateien einen wahlfreien Zugriff durchzuführen. Gerade bei Gerätedateien wie Druckern oder Terminals ist ein wahlfreier Zugriff nicht möglich.


Zuerst die Syntax von fseek():

#include <stdio.h>

int fseek(FILE *datei, long offset, int origin);

Mit fseek() kann der Schreib-/Lesezeiger des Streams datei verschoben werden. Die Positionierung wird mit offset und origin angegeben. origin gibt den Bezugspunkt an, von wo ab der Schreib-/Lesezeiger verschoben werden soll. offset gibt an, wie weit von diesem Bezugspunkt aus der Dateizeiger verschoben wird. Für origin sind drei symbolische Konstanten in der Headerdatei <stdio.h> deklariert (siehe Tabelle 16.6).


Tabelle 16.6 Bezugspunkt für die Positionierung

Symbol Wert Offset-Rechnung ab
SEEK_SET

0

Anfang der Datei

SEEK_CUR

1

Aktuelle Position

SEEK_END

2

Ende der Datei


Das folgende kleine Beispiel demonstriert die Funktionsweise von fseek():

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

int main(void) {
   FILE *quelle, *fehler;
   int c;
   char datei[20];
   long pos = 0;

   printf("Welche Datei wollen Sie oeffnen : ");
   scanf("%s",datei);
   fflush(stdin);

   if( (quelle=fopen(datei,"a+")) == NULL) {
      if((fehler=fopen("fehler.log","a+")) != NULL) {
         fprintf(fehler,"Konnte %s nicht oeffnen\n",datei);
         fprintf(stderr,"Konnte %s nicht oeffnen\n",datei);
         return EXIT_FAILURE;
      }
      fprintf(stderr,"Konnte %s nicht oeffnen\n",datei);
      return EXIT_FAILURE;
   }

   /* Das Zeichen '*' soll das Ende unserer Eingabe markieren. */
   printf("Eingabe machen und mit '*' beenden\n");
   while( (c=getc(stdin)) != '*')
      putc(c,quelle);

   /* Sie setzen den Zeiger quelle an den Anfang der Datei. */
   fseek(quelle, 0L, SEEK_SET);

   /* Sie geben die ganze Datei auf dem Bildschirm aus. */
   printf("\nAusgabe der kompletten Datei : \n");
   while( (c=getc(quelle)) != EOF)
      putc(c,stdout);

   /* Zur Demonstration gehen Sie von der aktuellen Position
    * 10 Zeichen zurück und geben die letzten 10 Zeichen aus. */
   printf("\nDie letzten 10 Zeichen : ");
   fseek(quelle, -10L, SEEK_CUR);
   while( (c=getc(quelle)) != EOF)
      putc(c,stdout);

   /* Sie legen selbst fest, wie viele Zeichen wir vom Start aus
    * einrücken wollen. */
   printf("\nAnzahl der Stellen einruecken (vom Anfang): ");
   scanf("%ld",&pos);
   fflush(stdin);

   fseek(quelle, 0L, SEEK_SET);
   fseek(quelle, pos,SEEK_CUR);

   while( (c=getc(quelle)) != EOF)
      putc(c,stdout);
   return EXIT_SUCCESS;
}

Abbildung 16.5 Verschieben des Schreib-/Lesezeigers mit der Funktion »fseek()«

Zuerst wird eine Datei geöffnet. Falls dies nicht gelingt, wird eine Datei mit dem Namen fehler.log beschrieben. Anschließend wird so lange eine Eingabe gemacht, bis das Zeichen '*' eingegeben wurde. Die Eingabe wird an das Ende der Datei gehängt, oder es wird, falls keine Datei vorhanden ist, eine entsprechende Datei erzeugt ("a+"-Modus). Dann wird mit

fseek(quelle, 0L, SEEK_SET);

der Schreib-/Lesezeiger des Streams quelle an den Anfang der Datei gesetzt, da SEEK_SET als Anfang der Datei deklariert ist. Wenn stattdessen Folgendes verwendet würde

fseek(quelle, 10L, SEEK_SET);

wäre der Schreib-/Lesezeiger vom Anfang der Datei um zehn Bytes nach vorn verschoben, also dann zehn Zeichen vom Dateianfang entfernt. Anschließend wird die vollständige Datei auf dem Bildschirm ausgegeben. Jetzt befindet sich der Schreib-/Lesezeiger am Ende der Datei. Als Nächstes wird mit

fseek(quelle, -10L, SEEK_CUR);

der Schreib-/Lesezeiger um zehn Stellen von der aktuellen Position (SEEK_CUR) zurückgeschoben. Es ist also auch möglich, negative Werte für offset anzugeben. Dabei werden die zehn letzten Zeichen auf dem Bildschirm ausgegeben. Dann erfolgt eine Abfrage, um wie viele Stellen der Schreib-/Lesezeiger des Streams quelle vom Anfang der Datei verschoben werden soll. Dies wird gleich programmtechnisch umgesetzt mit:

fseek(quelle, pos,SEEK_CUR);

Benötigen Sie die aktuelle Position des Schreib-/Lesezeigers im Stream datei, können Sie diesen mit der Funktion ftell() ermitteln. Die Syntax lautet:

long ftell(FILE *datei);

Falls dabei ein Fehler auftritt, liefert diese Funktion einen Wert kleiner als 0 zurück. Bei Erfolg gibt sie die aktuelle Position des Schreib-/Lesezeigers in Byte zurück.

Die Funktion ftell() können Sie ebenso einsetzen, um die Größe einer Datei in Byte zu ermitteln:

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

int main(void) {
   FILE *quelle;
   char datei[20];

   printf("Welche Datei wollen Sie oeffnen : ");
   scanf("%s",datei);

   if( (quelle=fopen(datei, "r")) == NULL) {
      fprintf(stderr, "Konnte %s nicht oeffnen\n", datei);
      return EXIT_FAILURE;
   }
   /* Wir setzen den FILE-Zeiger ans Ende der Datei. */
   fseek(quelle, 0L, SEEK_END);
   printf("Die Datei ist %ld Bytes gross!!\n", ftell(quelle));
   return EXIT_SUCCESS;
}

Nachdem mit fseek() der FILE-Zeiger an das Ende der Datei positioniert wurde, kann mit ftell() die Position und auch die Größe in Byte abgefragt werden. ftell() liefert als Rückgabewert den Datentyp long.

Es existiert auch eine andere Möglichkeit, den Schreib-/Lesezeiger wieder zurück an den Anfang der Datei zu setzen. Statt mit

fseek(quelle, 0L, SEEK_SET);

kann dies auch mit der folgenden Funktion realisiert werden:

rewind(quelle);

Beide Funktionen erfüllen denselben Zweck. Die Syntax von rewind() lautet:

#include <stdio.h>

void rewind(FILE *datei);


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