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.23 Formatiert in einen String schreiben und formatiert aus einem String lesen – »sscanf()« und »sprintf()« topZur vorigen Überschrift

Die Funktion sprintf() ist in der Headerdatei <stdio.h> deklariert und nicht – wie häufig irrtümlicherweise angenommen – in <string.h>. Sie arbeitet genauso wie printf(), nur dass statt der Ausgabe auf dem Bildschirm formatiert in einen String geschrieben wird. So lassen sich verschiedene Formatelemente formatiert in einen String schreiben. Die Syntax dazu lautet:

int sprintf( char * restrict target_string,
             const char * restrict format, ...);
int snprintf( char * restrict target_string, size_t n
              const char * restrict format, ...);

Mit dem ersten Parameter target_string wird die Adresse des Zielstrings angegeben. Das zweite und die weiteren Argumente von sprintf() haben dieselbe Bedeutung wie schon bei der Funktion printf(). snprintf() funktioniert genauso wie sprintf(), nur werden hierbei nicht mehr als n Bytes in den Zielstring target_string geschrieben.

Diese Funktion eignet sich besonders gut, wenn Sie Zahlen in einen String konvertieren wollen. Zudem schreibt sie am Ende das '\0'-Zeichen. Dazu ein kurzes Listing:

/* sprint.c */
#include <stdio.h>
#include <stdlib.h>
#define BUF 255

int main(void) {
   char string1[BUF];
   char string2[BUF];
   int anzahl = 10;
   char gegenstand[] = "Kartoffel";
   float liter = 1.55f;
   char fluessigkeit[] = "Limo";

   sprintf(string1, "%d kg %s\n",anzahl,gegenstand);
   sprintf(string2, "%.2f Liter %s\n",liter,fluessigkeit);

   printf("%s",string1);
   printf("%s",string2);
   return EXIT_SUCCESS;
}

Abbildung 16.9 Formatiert in einen String schreiben

Die Funktion sscanf() stellt das Gegenstück zur Funktion sprintf() dar. Sie funktioniert genauso wie scanf(), nur liest sscanf() die Formatelemente nicht von der Tastatur ein, sondern von einem String. Die Syntax sieht so aus:

int sscanf( const char * restrict quell_string,
            const char * restrict format, ...);

Im ersten Argument befindet sich der Quellstring, von dem anschließend die Eingabezeichen mit den Formatbezeichnern des zweiten Arguments in die Variablenliste eingelesen werden. Am Dateiende oder bei einem Fehler gibt diese Funktion EOF zurück. Damit können Strings wieder in Zahlen umgewandelt werden. Hier sehen Sie ein Beispiel zu sscanf():

/* sscanf.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv) {
   int count = 1, check, temp, summe = 0;

   if (argc < 2) {
      fprintf(stderr, "Verwendung: %s Integer"
                      " Integer [Integer_n]\n", *argv);
      return EXIT_FAILURE;
   }
   while(count < argc) {
      /* einzelne Argumente in Integerwerte konvertieren */
      check = sscanf(argv[count], "%d", &temp);
      /* ungültiges Argument wird ignoriert */
      if(check == EOF)
         count++;
      else {
         summe += temp;
         count++;
      }
   }
   printf("Summe aller Ganzzahlen der Argumente: %d\n", summe);
   return EXIT_SUCCESS;
}

Mit diesem Listing werden die Ganzzahlen, die dem Programm beim Aufruf über die Kommandozeile als Argumente mitgegeben wurden, als Summe berechnet. Die einzelnen Argumente werden mit der folgenden Zeile in Integerwerte konvertiert:

check = sscanf(argv[count], "%d", &temp);

Zur Verdeutlichung folgt hier noch ein weiteres Beispiel mit den beiden Funktionen sprintf() und sscanf():

/* form.c */
#include <stdio.h>
#include <stdlib.h>
#define NUMITEMS 4

char *namen[4] = {
   "Jürgen", "Fatma", "Gismo", "Jonathan"
};

int main(void) {
   int schleife;
   char temp[4][80];
   char name[20];
   int alter;
   long lohn;

   /* Wir erstellen Namen, Alter und Gehalt. Alter und Gehalt
    * werden durch Zufallszahlen erzeugt. Mit sprintf schreiben
    * wir die Daten formatiert nach int temp. */
   for (schleife = 0; schleife < NUMITEMS; ++schleife)
      sprintf(temp[schleife], "%s %d %ld"
         ,namen[schleife], rand()%20+18, rand()+27500L);

   /* Wir erstellen eine Kopfzeile. */
   printf("%4s | %-20s | %5s | %9s\n",
       "#","Name","Alter","Gehalt");
   printf(" ----------------------------------------"
          "----------\n");

   /* Mit sscanf lesen wir die Daten formatiert aus temp aus,
    * und zwar dort, wo wir zuvor mit sprintf die Daten
    * formatiert geschrieben haben. */
   for (schleife=0; schleife < NUMITEMS; ++schleife) {
      sscanf(temp[schleife],"%s %d %ld",(char*)&name,&alter,&lohn);
      printf("%4d | %-20s | %5d | %9ld\n",
         schleife+1,name,alter,lohn);
   }
   return EXIT_SUCCESS;
}

Abbildung 16.10 Formatiertes Schreiben in einen und Lesen aus einem String

Dies ist ein recht praktisches Beispiel. Zuerst wird mit sprintf() formatiert in das zweidimensionale Array temp geschrieben und anschließend mit sscanf() wieder formatiert ausgelesen.



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