fscanf()

fscanf() ist in der stdio definiert, die in C über stdio.h, bzw in C++ über cstdio eingebunden wird.

Funktion

fscanf() wird dazu verwendet, um einen String zu interpretieren und in Variablen abzulegen, wie es über einen FormatString beschrieben ist.

Signatur

#include <stdio.h>
int fscanf( FILE * file, char const * formatString, ... );

file: Datenstream, aus dem der zu interpretierende String gelesen wird.
formatString: Formatstring, der beschreibt, wie der zu parsende String zusammengesetzt ist
: Eine Anzahl von Argumenten, entsprechend des Formatstrings

Return Value: Die Länge der geparsten Zeichen aus dem Eingabestring.

Fehlerquellen

Der Eingabestring muss dem Formatstring entsprechen. fscanf() liest aus einer Datei, die oft Aufgrund von Eingaben des Benutzers erstellt wird. Gibt der Benutzer die Daten nicht genau in dem Format ein wie es dem Formatstring entspricht, führt dies zu willkürlichen Ergebnissen. Da der Entwickler den Benutzer nicht kontrollieren kann, darf man nicht davon ausgehen, dass die Eingaben einen Sinn ergeben. Entsprechend gefährlich ist die Verwendung von fscanf(). Im nachfolgenden Beispiel wird ein String eingelesen, ist dieser String länger als der Zwischenspeicher, so kann das Programm abstürzen. Weiterhin darf der String keine Leerzeichen enthalten, da diese ein Trennsymbol zwischen mehreren Strings darstellt. Für String-Eingaben sollte entweder fgets(), eine GUI oder Parameter verwendet werden.

Beispiel

#include <stdlib.h>
#include <stdio.h>
 
int main()
{
  int i = 0;
  char string[256];
  FILE * file = fopen( "datei.txt", "r" );
 
  if( file )
  {
    fscanf( file, "%s", &string[0] );   // Adresse des ersten Buchstabens
    fscanf( file, "%i", &i );           // Adresse von i
 
    printf( "String gelesen: %s\n", string );
    printf( "Integer gelesen: %d\n", i );
  }
 
  return EXIT_SUCCESS;
}

Um die benötigte Datei zu erzeugen schreiben wir „proggen.org 42“ in die Datei „datei.txt“:

$ echo "proggen.org 42" > datei.txt

Ausgabe:

String gelesen: proggen.org
Integer gelesen: 42

siehe auch