Die Rolle von std::ws (whitespace) beim Lesen von Daten
Gespeicherten Daten in meiner Datei ist (Leerzeichen, Hinzugefügt am Anfang und Ende, auf den Zweck, für diesen test):
1 2 3
Laden der Daten " mit dem folgenden code mit oder ohne "std::ws" nicht zu keinen Unterschied. Also ich bin verwirrt durch die Rolle des "std::ws" wie ich gesehen habe code verwenden. Kann mir jemand ein bisschen erklären? Danke!
void main ()
{
ifstream inf;
inf.open ("test.txt");
double x=0, y=0, z=0;
string line;
getline(inf, line);
istringstream iss(line);
//Using "std::ws" here does NOT cause any difference
if (!(iss >> std::ws >> x >> y >> z >> std::ws))
{
cout << "Format error in the line" << endl;
}
else
{
cout << x << y << z << endl;
}
iss.str(std::string ());
iss.clear();
cin.get();
}
- Whitespace wird entfernt, am Anfang der Extraktion standardmäßig. Wenn Sie
std::ios_base::noskipws
auf oder unformatierte Eingabe dannstd::ws
nützlich sein kann. - Die Flagge heißt
skipws
;noskipws
ist ein manipulator-Funktion. - der primäre nutzen ist nicht so viel, wenn
std::ios_base::skipws
deaktiviert ist, aber eher mit unformatierter Eingaben, die nicht überspringen der führenden Leerräume.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den primären Einsatz von
std::ws
ist beim Wechsel zwischen formatierten und unformatierten Eingabe:std::getline(in, value)
hat nicht überspringen der führenden LeerräumeBeispielsweise beim Lesen einer
age
und einfullname
Sie könnten versucht sein, es zu Lesen, wie diese:Aber wenn ich das eingeben dieser Informationen verwenden
Es drucken würde so etwas
Das problem ist, dass der Zeilenumbruch nach der
47
ist noch vorhanden und füllt sofort diestd::getine()
Anfrage. Als ein Ergebnis, das Sie lieber verwenden diese Anweisung, um Daten zu LesenDen Einsatz von
std::cin >> std::ws
überspringt Leerzeichen, insbesondere die newline, und trägt auf der Lektüre, wo der eigentliche Inhalt eingetragen.ignore
.if()
Zustand ist so geschrieben, wieif (std::cout << "Enter your age: " && std::cin >> age && std::cout << "Enter your full name: " && std::getine(std::cin >> std::ws, fullname)) { ... }
>> ws
sicher sein, dass der Zeilenumbruch wird genauso behandelt wie tab oder space. Scheint den Verdacht zu mir.47 Dietmar Kühl
, dann>> ws
ist immer noch notwendig, entfernen Sie die führenden Leerzeichen. Das könnte ein klareres Beispiel.std::cin.ignore()
würde ich beginnen Sie die Eingabe" \n"
und wenn Sie dannignore()
bis zum Ende der Zeile würde ich geben"47 Dietmar Kühl"
weiter! Skipping nur Raum, einschließlich zugegeben, so viele Zeilenumbrüche wie eingegeben, die vor der nicht-whitespace-scheint eine bessere option, wenn die Daten möglicherweise manuell eingegeben. Natürlich, wenn eine Datei in einer bestimmten Weise formatiert werden, z.B. mit JSON-oder CSV-keiner dieser Ansätze gelten.int
ist zu Lesen (vorausgesetztstd::ios_base::skipws
eingestellt ist).skipws
, dein Beispiel" \n47 Dietmar Kühl"
toleriert wird. In der Regel, obwohl ein line-orientiertes Programm verwendetgetline
zu extrahieren, re-Puffer, und überprüfen Sie, dass die Zeilenumbrüche nicht als gewöhnliche "Feld-Trennzeichen."Standardmäßig wird der stream ist
skipws
- bit gesetzt wird und Leerzeichen werden automatisch übersprungen, vor jedem Eingang. Wenn Sie unset es mitiss >> std::noskipws
ist, dann müssen Sieiss >> std::ws
später.Gibt es auch Zeiten, in denen Leerzeichen werden nicht automatisch übersprungen. Zum Beispiel, um zu erkennen, das Ende der Eingabe, die Sie verwenden können
if ( ( iss >> std::ws ).eof() )
.skipws und noskipws sind sticky aber ws ist NICHT klebrig, so dass, wenn Sie überspringen möchten, mit Leerzeichen ws müssen Sie es vor jedem operator>>.
Beachten Sie auch, dass skipws und noskipws gelten nur für die formatierte Eingabe durchgeführt, mit dem operator>> auf dem stream.
aber ws gilt sowohl für die formatierte Eingabe ( mit operator>> ) und unformatierte Eingabe (z.B. get, put, putback , .... )
Ausgabe: