Verstehe nicht, wie sscanf () - Funktion funktioniert
Ich nicht verstehen, wie sscanf()
in C++ für das Lesen aus einer Datei.
Ich arbeite an einem Programm, das liest die drei Namen der Läufer aus einer Datei, zusammen mit Ihren jeweils fünf besten Zeiten. Ich möchte einen Durchschnitt von jedem Läufer ' s Zeiten und sagen, wer der beste runner ist. Ich bin mit der absolut härteste Zeit mit Datei IO.
Cplusplus.com hat geholfen, einige, aber nicht wirklich sagen, wie zu Lesen, ausschalten, trennen Sie die char* - (- Namen) von den Wagen (mal), etc. Anderswo, ich kann nicht entkommen, jargon und Erklärungen sind zu technisch.
Ein Freund zeigte mir dieses code-snippet zu erklären.
while(file>>str) {
sscanf (str.c_str(),"%d",&myint);
}
Jemand Verstand erklärt mir, wie ich es Lesen?
- In C++ nicht verwenden
sscanf()
. Es ist eine C-Funktion, mit Einschränkungen, die Sie auferlegt von C. - was würden Sie stattdessen verwenden? regex?
- Versuchen Sie das Logo vielleicht. Selbst Profis haben Probleme mit C manchmal.
- sscanf(dieser string wird formatiert, dieses format, und speichern Sie diese Zeichenfolge)
- iostreams sind mächtiger als sscanf, und einfacher zu verwenden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
sscanf()
als ein wenig old-school, aber kann sehr nützlich sein und ist es Wert mastering. Ich glaube, Sie suchen nach etwas wie:wo
input
ist eine Zeile aus der Datei. Einige der Grundlagen sind%s
für die basic-string-und die%f
für den Schwimmer.Genießen Sie den start in die Programmierung; es wird nur besser, wie Sie Erfahrungen sammeln.
Insgesamt, die
sscanf()
Funktion wird verwendet, um zu konvertieren (C -) string in eine Reihe von Werten, die im Programm Variablen unter der Leitung eines format-Strings, die beschreibt, die Werte finden sich in der string.Sezieren des zitierten code:
Können wir davon ausgehen, dass
file
ist ein input-stream-undstr
ist ein string. Diewhile
Schleife liest man "Wort" aus der Eingabe in die Zeichenfolge, die bei jeder iteration, wo ein "Wort" ist eine Reihe von nicht-white space-Zeichen, womöglich gefolgt von einer Reihe von white-space-Zeichen.Den
sscanf()
- Anweisung im Beispiel hat drei Argumente und einen Wert zurück, die ignoriert wird (und nicht auf eigene Gefahr). Das erste argument ist ein C-Stil-string, so ist das Wort, das gelesen wurde, wird in ein C-string mit derstr.c_str()
nennen. Das zweite argument ein format-string, welcher erzähltsscanf()
was zu erwarten ist, die in der Zeichenfolge. In diesem Fall, die%d
umwandlungsspezifikator gibt eine ganze Dezimalzahl. Das Dritte argument ist ein Zeiger auf den entsprechenden Typ, wo der konvertierte Wert gespeichert werden. Im Allgemeinen, eine format-string enthalten kann, die eine Reihe von Konvertierungs-Spezifizierer, und es muss ein Zeiger-argument für jede conversion-Bezeichner zugewiesen (Sie können überspringen Daten durch unterdrücken der Zuordnung).Den Rückgabewert von
sscanf()
ist die Anzahl der erfolgreichen Zuordnung von conversions. In diesem Fall sollten Sie prüfen, dass Sie bekam eine Konvertierung abgeschlossen ist.Hier ist ein funktionierendes Miniatur-Programm, basierend auf deinem Beispiel:
Angenommen, Sie geben in der Eingabezeile:
123 234 345 abc
. Dann das Programm produziert:Beachten Sie, dass wenn die Namen die Sie beschäftigen, enthalten vor-und Nachname, evtl. mit Initiale in der Mitte, und mit 5 Nummern (alle in einer Zeile), dann werden Sie wahrscheinlich brauchen einen anderen Prozess. Sie würde wahrscheinlich verwenden
getline()
Lesen eine ganze Zeile, und klicken Sie dann versuchen Sie zu analysieren, es mitsscanf()
(oder vielleicht verwenden würde, einstringstream
statt). Sie würden zu tun haben mit weniger als 5 zahlen auf der Linie, natürlich. I/O ist immer schwierig, vor allem, wenn man sich mit falschen Daten zu (und Produktion-Qualität-code muss immer bereit sein, zu tun mit fehlerhaften Daten).scanf wenn das Gegenteil von printf.
Das erste "s" in "sscanf" bedeutet, es durchsucht eine Zeichenfolge. "fscanf" durchsucht eine Datei, und "scanf" durchsucht die standard-Eingabe.
die Formatierung ist die gleiche wie printf.
wenn
sprintf(s, "%d x", 5)
druckt "5 x" in s alssscanf("5 x", "%d x", &n)
wird Platz 5 in n. Es ist immer das Gegenteil von printf.Ausnahme ist
%s
.%s
im printf () druckt JEDEN string. printf("%s", str); gedruckt str, egal, was in str. In scanf,%s
ist ein Wort. Ein Wort ist etwas, ohne Leerzeichen. so Lesen Sie eine%s
liest nur ein Wort.sscanf(str, "%d", &a);
Mittel str hat ein format von "%d", (ein einzelnes Komma-Zahl), und Sie sind reaing diese Nummer ein (weil &a ist das zweite argument).Als Beispiel
Folge a = 10, b = 20, c= 30, d = 40. jede %d wird gelesen, um den nächsten argument, und jeder wird Lesen eine einzige Dezimalzahl.
Im Grunde geben Sie einen string-format in ein zweites argument, um die sscanf-Funktion ersetzen von Variablen, die Sie wollen
analysieren mit Platzhaltern.
Sagen, Sie wissen, dass Ihre Datei besteht aus folgenden Zeilen:
Kümmert man sich nicht über alles in dieser Zeichenfolge anderen als Menge von Flaschen für jeden Tag.
Fixieren Sie die Teile, die sich nicht ändern, d.h. "Vater kaufte Flaschen rum am Tag"
und geben Sie einen Platzhalter für die Teile, die Sie möchten, zu extrahieren, der aus der Zeichenfolge.
Dein code würde dann so Aussehen:
Dem symbol nach % nur gibt den Typ der variable, die Teil analysiert werden.
d
hier bedeutet dezimal.Verwenden Sie einfach
sscanf(str.c_str(), "%d", &myint)
stattsscanf(str, "%d", &myint)
.Sehe ich die andere erklärt über
sscanf
, aber ich denke, deine Frage ist ein bisschen anders.sscanf
ist eine C-Funktion, aber Sie können es verwenden, in C++, da C++ - includes C.sscanf
im Grunde nimmt eine Zeichenfolge, teilen Sie ihn zeigen, und weisen Sie dann diese Teile an Variablen. Aber es gibt keine solche Sache namensstring
in C. deshalbsscanf
nimmt den parameter alschar*
nämlichchar pointer
die im Grunde die gleiche Arbeit mitstring
.In C++ verwenden, sollten Sie
c_str()
Funktion zum konvertieren vonstring
zuchar pointer
.