Anleitung zur Verwendung der Funktionen scanf und fscanf in C++

Beim Programmieren in C++ gibt es viele Situationen, in denen Sie Daten aus einem Stream oder von der Standardeingabe lesen müssen.

Das Lesen und Speichern von Daten bei gleichzeitiger Klassifizierung in verschiedene Formate ist ein wesentlicher Bestandteil der Programmausführung. Ohne die Möglichkeit, externe Daten als Eingabe aufzurufen, wären Programme nicht in der Lage, mit Daten zu arbeiten, die über die Daten der Benutzer hinausgehen cin oder ähnliche Eingabefunktionen.

Die C++-Funktionen scanf Und fscanf Daten lesen und Daten speichern.

  • Scanf (ausgesprochen: scan-eff) liest formatierte Daten aus der Standardeingabe und platziert sie an einem angegebenen Ort.
  • Fscanf (ausgesprochen: eff-scan-eff) liest formatierte Daten von einem Zeiger, der auf ein Dateiobjekt hinweist, das den Eingabestream bestimmt, aus dem Daten gelesen werden sollen.

Schnelle Navigation
So funktionieren die Funktionen fscanf und scanfArbeiten mit dem Formatspezifiziererfscanf und scanf für Multithreading freischaltenBeispiel für die Verwendung von scanf zur Rückgabe von DatenBeispiel für die Verwendung von fscanf zur Rückgabe von DatenSind scanf und fscanf für professionelle C++-Programmierer nützlich?

So funktionieren die Funktionen fscanf und scanf

Mann arbeitet an seinem Computer

Beide Funktionen lesen Daten und speichern sie dann gemäß dem Parameterformat, das in ihren zusätzlichen Argumenten angegeben ist. Diese Argumente verweisen auf zugewiesene Objekte des im entsprechenden Argument angegebenen Typs Formatzeichenfolge.

Für beide Funktionen ist die Formatzeichenfolge legt die Interpretation des Arguments fest. Der Formatzeichenfolge kann nur Multibyte-Zeichen enthalten, die mit dem anfänglichen Konvertierungsstatus beginnen und enden. Um es zu nutzen scanf Und fscanf In C++ müssen Sie die Zeichenfolge identifizieren Formatzeichenfolge deutet tatsächlich darauf hin.

Diese Zeichenfolgen können einen der folgenden Zeichentypen enthalten:

  • Leerzeichen. Leerzeichen werden durch angegeben isspace(). Dazu gehören Leerzeichen und Zeilenumbrüche. Wann scanf oder fscanf Lesen Sie ein Leerzeichen, speichern Sie es nicht. Dies bedeutet, dass ein Leerzeichen im Wesentlichen mit einer beliebigen Anzahl von Leerzeichen in der Datei identisch ist Formatzeichenfolge – Quantität erzeugt keinen funktionalen Unterschied.
  • Nicht-Leerzeichen. Dazu gehören alle Zeichen, die keine Leerzeichen oder Zeilenumbrüche sind, mit Ausnahme des Prozentzeichens (%). Beim Lesen eines Zeichens, das kein Leerzeichen ist, scanf Und fscanf liest das in der angegebene übereinstimmende Nicht-Leerzeichen, speichert es aber nicht Formatzeichenfolge bis das nächste Zeichen im Eingabestream nicht übereinstimmt. Dann endet die Funktion.
  • Formatspezifizierer. Konvertierungsspezifikationen, die mit dem Prozentzeichen beginnen, geben den Typ und das Format aller Daten an scanf oder fscanf muss abrufen. Beim Lesen dieses Zeichens lesen beide Funktionen die folgenden Zeichen und konvertieren sie in die Werte des angegebenen Formats. Dieser Wert muss einem Argument in der Argumentliste zugewiesen werden.

Alle drei dieser Funktionen lesen die Formatzeichenfolge von links nach rechts. Jedes Zeichen ohne vorangehendes Prozentzeichen sollte mit der im Eingabestream aufgerufenen Zeichenfolge übereinstimmen.

Wenn die Zeichen nicht übereinstimmen, wird die Funktion mit einem Übereinstimmungsfehler beendet. Das widersprüchliche Zeichen bleibt im Eingabestream, als ob das Programm es nie gelesen hätte.

Sobald das Programm seinen ersten Formatbezeichner liest, konvertiert es den Wert des ersten Eingabefeld gemäß dieser Spezifikation in der Argumentliste. Der zweite Formatbezeichner weist das Programm an, das zweite Eingabefeld zu konvertieren und im zweiten Argument zu speichern usw. Dieses geordnete Muster setzt sich bis zum fort Formatzeichenfolge endet.

Arbeiten mit dem Formatspezifizierer

Der Formatbezeichner für fscanf Und scanf hat die folgende Form:

%[*][width][length]Spezifizierer

Der Spezifizierer Das Zeichen am Ende dieser Anweisung ist das wichtigste Element des Formatbezeichners. Es definiert welche Zeichen scanf oder fscanf extrahiert, legt dar, wie diese Zeichen interpretiert werden, und identifiziert den entsprechenden Argumenttyp.

C++-Programmierer müssen mit 12 Arten von Formatspezifizierern vertraut sein:

  • Ganze Zahlen. Geben Sie ganze Zahlen an mit „ich“. Dieses Format extrahiert eine unbegrenzte Anzahl positiver oder negativer Ziffern. Das ist ein unterzeichnet Argument, und obwohl es Dezimalstellen annimmt, ist ein „ÖDas Präfix ändert die Oktalziffern und ein „0x“ Präfix führt hexadezimale Ziffern ein.
  • Dezimale ganze Zahlen. Geben Sie dezimale Ganzzahlen an mit „D“ Für ein unterzeichnet Argument bzw „Du“ für ein ohne Vorzeichen Streit. Dieses Format extrahiert eine beliebige Anzahl von Dezimalstellen. Sie können sowohl positive als auch negative ganze Zahlen verwenden.
  • Oktale ganze Zahlen. Geben Sie oktale Ganzzahlen als an ohne Vorzeichen Argument mit „Ö“. Diese Ziffern verwenden ein Nummerierungssystem zur Basis Acht. Dieses Format unterstützt positive und negative Zahlen.
  • Hexadezimale ganze Zahlen. Geben Sie hexadezimale Ziffern mit an an ohne Vorzeichen Argument mit „X“. Dieses Format unterstützt positive und negative Zahlen.
  • Gleitkommazahlen. Geben Sie ein Fließkommazahlenformat mit „F“, „e“, „G„, oder „A“. Gleitkommazahlen können Dezimalstellen enthalten und entweder positiv oder negativ sein. C99-konform Implementierungen unterstützen auch das hexadezimale Gleitkommaformat mit dem „0x“ Präfix.
  • Figuren. Geben Sie das nächste Zeichen mit „ an.C“. Wenn der Formatbezeichner eine andere Breite als 1 aufweist, liest die Funktion genau diese Anzahl von Zeichen und speichert sie gemäß dem Argument an aufeinanderfolgenden Array-Speicherorten. Am Ende werden keine Nullzeichen angehängt.
  • Zeichenketten. Geben Sie Zeichenfolgen an mit „S“. Mit diesem Format können Sie eine beliebige Anzahl von Nicht-Leerzeichen angeben. Es stoppt beim ersten gefundenen Leerzeichen und fügt am Ende der Sequenz automatisch ein Nullzeichen hinzu.
  • Zeigeradressen. Geben Sie Zeigeradressen an mit „P“. Dieses Format extrahiert eine Folge von Zeichen, die einen Zeiger darstellen. Das jeweilige Format des Zeigers hängt vom verwendeten System und der verwendeten Bibliothek ab.
  • Scansets. Geben Sie einen bestimmten Scansatz an, indem Sie die Zeichen, nach denen Sie suchen möchten, in zwei Klammern einfügen.
  • Negierte Scansätze. Geben Sie einen negierten Scansatz mit Klammern und einem „ an.^”-Präfix in den Klammern. Dadurch werden alle Zeichen gelesen, die nicht in den Klammern definiert sind.
  • Zählen. Um die Anzahl der bisher von der Standardeingabe gelesenen Zeichen an der angegebenen Stelle zu speichern, ohne Eingaben zu verbrauchen, geben Sie „N“.
  • Identität. Angabe von „%„ist eine Identität. Eins „%“, gefolgt von einem zweiten „%„ist dasselbe wie ein einzelnes „%“.

Im Formatspezifiziererargument stehen zusätzliche Unterspezifizierer zur Verfügung. Diese können die Funktion verändern fscanf Und scanf entsprechend allgemein benötigter Verhaltensweisen.

  • Das Sternchen [*] es ist optional. Es weist das Programm an, die Daten aus dem Stream zu lesen, sie jedoch nicht an der Stelle zu speichern, auf die das Argument verweist.
  • Der [width] Der Unterspezifizierer weist den Lesevorgang an, eine bestimmte Anzahl von Zeichen zu lesen.
  • Der [length] Der Unterspezifizierer teilt dem Programm mit, welche Art von Speicher gemäß einer Reihe von durch definierten Formaten zu erwarten ist C99.

fscanf und scanf für Multithreading freischalten

Gesicht mit blauem Hintergrund

Beide fscanf Und scanf kann sicher in Multithread-Anwendungen arbeiten. fscanf_unlocked Und scanf_unlocked sind die Multithread-Varianten dieser beiden Funktionen.

Die entsperrten Versionen dieser Funktionen sind nicht threadsicher, daher dürfen Sie sie nur aufrufen, wenn der aufrufende Thread Eigentümer der Funktion ist DATEI Objekt – zum Beispiel nach erfolgreichem Aufruf flockfile() oder ftrylockfile().

Beispiel für die Verwendung von scanf zur Rückgabe von Daten

Um es zu nutzen scanfmüssen Sie die einschließen Standard-Header in Ihrem Code. Kombiniert mit printfermöglicht Ihnen die schnelle Eingabe und Rückgabe von Daten. Hier ist ein Beispiel:

#include

int main ()
{

Char str [80];
int i;
printf („Geben Sie Ihren Familiennamen ein:“);
scanf („%79s“,str);
printf („Geben Sie Ihr Alter ein:“);
scanf („%d“,&i);
printf („Herr %s, %d Jahre alt.\n“,str,i);
printf („Geben Sie eine Hexadezimalzahl ein:“);
scanf („%x“,&i);
printf („Sie haben %#x (%d) eingegeben.\n“,i,i);

0 zurückgeben;
}

Dieses Beispiel verwendet scanf neben der Standardeingabe, um den Benutzer zur Eingabe verschiedener Arten von Informationen aufzufordern. Es gibt die Art der Daten an, nach denen es fragt, was tiefere Implementierungen im Kontext des Programms ermöglicht. Beispielantworten könnten sein:

Geben Sie Ihren Familiennamen ein: Jackson
Gebe Dein Alter ein: 30
Herr Jackson, 30 Jahre alt.
Geben Sie eine Hexadezimalzahl ein: ff
Sie haben 0xff (255) eingegeben.

Beispiel für die Verwendung von fscanf zur Rückgabe von Daten

Funktionell, fscanf funktioniert ähnlich wie scanf. Der Hauptunterschied besteht darin fscanf muss aus einer Datei lesen, was bedeutet, dass Sie eine Datei identifizieren müssen, aus der gelesen werden soll, und dann dem Programm mitteilen müssen, wonach es in der Datei suchen soll. Zum Beispiel:

#include

int main ()

{

Char str [80];

float f;

DATEI * pDatei;

pFile = fopen („myfile.txt“, „w+“);

fprintf (pFile, „%f %s“, 3.1416, „PI“);

zurückspulen (pFile);

fscanf (pFile, „%f“, &f);

fscanf (pFile, „%s“, str);

fclose (pFile);

printf („Ich habe gelesen: %f und %s \n“,f,str);

0 zurückgeben;

}

Dieses Beispiel erstellt „meinedatei.txt” und schreibt eine Float-Zahl und einen String in die Datei. Der Stream wird dann zurückgespult und das Programm liest beide Werte mit fscanf. Die erzeugte Ausgabe sieht folgendermaßen aus:

Ich habe gelesen: 2.718 und e

Sind scanf und fscanf für professionelle C++-Programmierer nützlich?

Zwei Frauen in Streifen arbeiten zusammen

Beide scanf Und fscanf sind wichtige Schritte für jeden C++-Studenten auf dem Weg zum professionellen Programmierer. In fortgeschritteneren Szenarien können Sie diese Funktionen verwenden, um Vektordatentypen und andere komplexe Informationsformen in ein C++-Programm einzugeben.

Allerdings kann es im Umgang mit menschlichen Fehlern unvorhersehbar agieren. Wenn ein Benutzer nicht genau die Art von Informationen im genauen Format eingibt, das das Programm erwartet, kann es sein, dass es die Daten nicht erfolgreich lesen kann. Dies macht es zu einem ungewöhnlichen Anblick in Umgebungen, in denen Benutzer im Allgemeinen erwarten, dass Programme vorhersehbar ausgeführt werden, selbst wenn sie Fehler bei der Dateneingabe machen.

In C++ beides scanf Und fscanf arbeiten im Allgemeinen viel schneller als ihre iostream Äquivalente. Kommerzielle Anwendungen, die darauf ausgelegt sind, die Geschwindigkeit zu maximieren und gleichzeitig vorhersehbare Eingaben zu verarbeiten, können sie mit großer Wirkung zur Erreichung dieses Ziels nutzen.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen