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

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.21 Temporäre Dateien erzeugen – »tmpfile()« und »tmpnam()« Zur nächsten ÜberschriftZur vorigen Überschrift

Wollen Sie Daten während der Laufzeit eines Programms temporär zwischenspeichern, müssen Sie nicht extra eine neue Datei erstellen. Dafür gibt es in C spezielle Funktionen.

Mit der Funktion tmpnam() kann ein eindeutiger Name für eine temporäre Datei erzeugt werden. Die Syntax sieht wie folgt aus:

#include <stdio.h>

char *tmpnam(char *zgr);

Ein eindeutiger Name heißt, dass es sich um keinen Namen einer bereits existierenden Datei handelt. Insgesamt können mit TMP_MAX eindeutige Namen erzeugt werden. TMP_MAX ist in der Headerdatei <stdio.h> deklariert. Mit folgendem Programm können Sie herausfinden, wie viele temporäre Dateien auf Ihrem System erzeugt werden können:

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

int main(void) {
   printf("TMP_MAX = %u\n", TMP_MAX);
   return EXIT_SUCCESS;
}

Wird die Funktion tmpnam() hingegen so verwendet:

tmpnam(NULL);

dann wird die Datei in einem static-Speicherbereich untergebracht, und die Adresse wird als Funktionswert wiedergegeben. Das bedeutet, dass nachfolgende Aufrufe der Funktion tmpnam() dieselbe Adresse einnehmen. Aus diesem Grund sollte zuerst umkopiert werden, um die alte Adresse nicht zu überschreiben.

Sollte tmpnam() ohne den NULL-Zeiger aufgerufen werden, wird für zgr ein Adressbereich adressiert, der L_tmpnam Zeichen aufnehmen kann. L_tmpnam ist ebenso in der Headerdatei <stdio.h> deklariert.

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

int main(void) {
   printf("L_tmpnam= %d Zeichen\n", L_tmpnam);
   return EXIT_SUCCESS;
}

Kommen wir jetzt zur Funktion tmpfile(). Die Syntax lautet:

#include <stdio.h>

FILE *tmpfile(void);

Mit tmpfile() wird eine temporäre Datei im Binärmodus ("wb+") zum Lesen und Schreiben geöffnet. Die Datei mit einem eindeutigen Namen wird entweder beim Schließen der Datei mit fclose() oder bei der ordnungsgemäßen Beendigung des Programms automatisch gelöscht. Wenn das Programm abnormal beendet wurde, hängt es von der Implementierung ab, ob die temporäre Datei gelöscht wird oder nicht. Kann tmpfile() keine temporäre Datei öffnen, gibt diese Funktion einen Nullzeiger zurück. Wie auch schon bei tmpnam() können bei einem Programm laut C99-Standard mindestens TMP_MAX temporäre Dateien erzeugt werden.

Jetzt ist es Zeit, diese Funktionen anhand eines Programmbeispiels zu demonstrieren:

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

char string[] = {
   "Dies ist der String für die Testdatei\n"
   "Diese Zeile ist ein Lückenfüller !!!!\n"
   "Aber diese Zeile soll verändert werden\n"
   "Hier könnten noch viele Zeilen mehr stehen\n"
};

void create_text_file(void) {
   FILE *out = fopen("test.txt", "w");
   if(NULL == out) exit(EXIT_FAILURE);
   fputs(string, out);
   fclose(out);
}

int main(void) {
   FILE *in, *out;
   char line[80], *tmp;
   int line_nr = 1;

   /* Es wird eine Datei mit dem Inhalt string erzeugt. */
   create_text_file();
   /* Die Datei zum Ändern wird zum Lesen geöffnet. */
   in  = fopen("test.txt", "r");
   if(NULL == in) {
      fprintf(stderr, "Konnte Datei nicht erzeugen!\n");
      return EXIT_FAILURE;
   }
   tmp = tmpnam(NULL);     /* temporäre Datei erzeugen */
   /* temporäre Datei zum Schreiben öffnen */
   out = fopen(tmp, "w");
   if(NULL == out) {
      fprintf(stderr, "Konnte Datei nicht öffnen!\n");
      return EXIT_FAILURE;;
   }
   /* aus der Datei zeilenweise lesen und in
    * temporäre Datei schreiben */
   while( NULL != fgets(line, 80, in)) {
      /* Es soll die dritte Zeile geändert werden. */
      if(line_nr == 3)
         fputs("Ein veränderte Zeile!\n", out);
      else
         fputs(line, out);
      line_nr++;
   }
   fclose(in);
   fclose(out);
   remove("test.txt");        /* Original löschen           */
   rename(tmp, "test.txt");   /* temporäre Datei umbenennen */
   return EXIT_SUCCESS;
}

Das Programm demonstriert den Einsatz temporärer Dateien recht eindrücklich. Es wird zuerst eine Textdatei test.txt erzeugt, die mit dem Inhalt von string beschrieben wird. Diese Datei wird jetzt zum Lesen geöffnet. Anschließend wird mit tmpnam() eine temporäre Datei erzeugt. Durch das Argument NULL befindet sich diese Datei im static-Speicherbereich. Diese temporäre Datei öffnen Sie nun zum Schreiben. In der while()-Schleife wird Zeile für Zeile aus der Datei gelesen und in die temporäre Datei geschrieben. Ist die dritte Zeile erreicht, wird diese geändert. Danach geht es wieder Zeile für Zeile weiter, bis keine mehr vorhanden ist. Am Ende des Programms wird die Originaldatei gelöscht und die temporäre Datei in diese umbenannt. Das Listing stellt eine einfache Möglichkeit dar, eine Textdatei zu verändern. Dies kann z. B. recht sinnvoll sein, wenn Sie ein Textverarbeitungsprogramm entwickeln wollen und dabei eine Funktion einbauen, die alle 10 Minuten eine Sicherungskopie vom Originaltext erstellt. Die meisten guten Textverarbeitungsprogramme besitzen dieses Feature.

Jetzt will ich Ihnen auch noch ein Listing mit der Funktion tmpfile() zeigen:

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

int main(void) {
   FILE *tmp;
   int i;
   char tempdatei[L_tmpnam], zeile[1000];

   printf("Demo-Funktion tmpnam ...\n");
   for(i = 1; i <= 4; i++) {
      if(i%2==0) {
         printf("%20d. %s\n",i,tmpnam(NULL));
      }
      else {
         tmpnam(tempdatei);
         printf("%20d. %s\n",i,tempdatei);
      }
   }
   printf("Demo Funktion tmpfile ...\n");
   tmp=tmpfile();
   if( NULL == tmp ) {
      fprintf(stderr,"Fehler bei tmpfile\n");
      return EXIT_FAILURE;
   }
   /* Wir schreiben mit fputs in die temporäre
    * Datei, auf die tmp zeigt. */
   fputs("Dieser Text wird in die temporäre"
         " Datei geschrieben\n", tmp);
   rewind(tmp);
   if(fgets(zeile,sizeof(zeile),tmp) == NULL) {
      fprintf(stderr, "Fehler bei fgets ...\n");
      return EXIT_FAILURE;
   }
   printf("%s\n",zeile);
   return EXIT_SUCCESS;
}

Als Erstes wird in diesem Programm die Funktion tmpnam() demonstriert. Sie erzeugen zwei temporäre Dateien mit dem NULL-Zeiger und zwei ohne. Anschließend erstellen Sie eine temporäre Datei und schreiben mit fputs() einen Text in diese. Danach lesen Sie aus der angefertigten temporären Datei, auf die der FILE-Zeiger tmp zeigt. Bei ordentlichem Beenden wird diese temporäre Datei auch wieder gelöscht. Zum Beweis, dass auch tatsächlich eine temporäre Datei erzeugt wurde, können Sie vor der Zeile

if(fgets(zeile,sizeof(zeile),tmp) == NULL)

aus der temporären Datei lesen und das Programm mit exit() abbrechen, etwa so:

rewind(tmp);
exit (1);
if(fgets(zeile,sizeof(zeile),tmp) == NULL)

Nun sollte sich in dem Verzeichnis, in dem Sie das Programm ausführen, eine Datei mit folgendem Textinhalt befinden:

Dieser Text wird in die temporäre Datei geschrieben

Rheinwerk Computing - Zum Seitenanfang

16.21.1 »mkstemp()« – sichere Alternative für Linux/UNIX (nicht ANSI C) topZur vorigen Überschrift

Beim Übersetzen mit Linux/UNIX bekommen Sie bei tmpnam() eine Warnung angezeigt, diese Funktion nicht zu verwenden. Es wird Ihnen geraten, die Funktion mkstemp() einzusetzen. Diese Warnung wird deshalb ausgegeben, weil die Funktion tmpnam() einen eindeutigen Namen zurückgibt. In der Zeit zwischen der Erzeugung des Namens und dem Öffnen der Datei könnte theoretisch eine Datei mit demselben Namen untergeschoben werden.

int mkstemp(char *template) ;

Die Funktion mkstemp() erzeugt einen temporären Dateinamen und öffnet diese Datei mittels open() und dem Flag 0_EXCL gleich für Sie. Bei Erfolg gibt Ihnen diese Funktion einen File-Deskriptor zum Lesen und Schreiben auf diese temporäre Datei zurück. Dank des Flags O_EXCL ist sichergestellt, dass die so erzeugte temporäre Datei wirklich einzigartig ist. Die geöffnete Datei verwendet den Modus 0600 und ist standardmäßig nur dem Eigentümer vorbehalten. Wenn andere User darauf zugreifen sollen (dürfen), müssen Sie das ändern (z. B. mit fchmod(), fchown()). mkstemp() liefert bei einem Fehler –1 zurück, wenn die Datei nicht erzeugt oder geöffnet werden kann.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen. >> Zum Feedback-Formular
<< zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z

 C von A bis Z
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: C/C++






 C/C++


Zum Katalog: Einstieg in C






 Einstieg in C


Zum Katalog: Schrödinger programmiert C++






 Schrödinger
 programmiert C++


Zum Katalog: C++ Handbuch






 C++ Handbuch


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
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.


[Rheinwerk Computing]

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