std::quoted
Von cppreference.com
| Definiert im Header <iomanip> |
||
| template< class CharT > /*nicht spezifiziert*/ quoted( const CharT* s, |
(1) | (seit C++14) |
| template< class CharT, class Traits, class Allocator > /*nicht spezifiziert*/ quoted( const std::basic_string<CharT, Traits, Allocator>& s, |
(2) | (seit C++14) |
| template< class CharT, class Traits> /*nicht spezifiziert*/ quoted( std::basic_string_view<CharT, Traits> s, |
(3) | (seit C++17) |
| template< class CharT, class Traits, class Allocator > /*nicht spezifiziert*/ quoted( std::basic_string<CharT, Traits, Allocator>& s, |
(4) | (seit C++14) |
Ermöglicht das Einfügen und Extrahieren von Anführungszeichen-umschlossenen Zeichenketten, wie sie z.B. in CSV oder XML vorkommen.
1-3) Wenn in einem Ausdruck out << quoted(s, delim, escape) verwendet wird, wobei
out ein Ausgabestrom mit char_type gleich CharT und für die Überladungen (2,3) traits_type gleich Traits ist, verhält sich wie eine FormattedOutputFunction, die in out eine Zeichensequenz seq einfügt, die wie folgt aufgebaut ist:a) Zuerst wird das Zeichen delim zur Sequenz hinzugefügt.
b) Dann jedes Zeichen aus s, es sei denn, das nächste auszugebende Zeichen entspricht delim oder escape (bestimmt durch den Stream traits_type::eq), dann wird zuerst eine zusätzliche Kopie von escape angehängt.
c) Am Ende wird delim noch einmal an
seq angehängt.- Dann, wenn seq.size() < out.width(), werden out.width()-seq.size() Kopien des Füllzeichens out.fill() entweder am Ende der Sequenz (wenn ios_base::left in out.flags() gesetzt ist) oder am Anfang der Sequenz (in allen anderen Fällen) hinzugefügt.
- Schließlich wird jedes Zeichen aus der resultierenden Sequenz ausgegeben, als ob out.rdbuf()->sputn(seq, n) aufgerufen würde, wobei n=std::max(out.width(), seq.size()) und out.width(0) aufgerufen wird, um die Auswirkungen von std::setw ggf. zu löschen.
4) Wenn in einem Ausdruck in >> quoted(s, delim, escape) verwendet wird, wobei
in ein Eingabestrom mit char_type gleich CharT und traits_type gleich Traits ist, werden Zeichen aus in extrahiert, unter Verwendung von std::basic_istream::operator>>, gemäß den folgenden Regeln:a) Wenn das erste extrahierte Zeichen nicht delim entspricht (bestimmt durch die Stream
traits_type::eq), wird einfach in >> s ausgeführt.b) Andernfalls (wenn das erste Zeichen der Begrenzer ist)
1) Wird das skipws-Flag des Eingabestroms deaktiviert.
2) Der Zielstring wird durch Aufruf von s.clear() geleert.
3) Zeichen werden aus
in extrahiert und an s angehängt, mit der Ausnahme, dass immer dann, wenn ein escape-Zeichen extrahiert wird, dieses ignoriert und das nächste Zeichen an s angehängt wird. Die Extraktion stoppt, wenn !in == true oder wenn ein nicht-escaped delim-Zeichen gefunden wird.4) Das abschließende (nicht-escaped) delim-Zeichen wird verworfen.
5) Das skipws-Flag des Eingabestroms wird auf seinen ursprünglichen Wert zurückgesetzt.
Inhalt |
[edit] Parameter
| s | - | der einzufügende oder zu extrahierende String |
| delim | - | das als Trennzeichen zu verwendende Zeichen, Standard ist " |
| escape | - | das als Escape-Zeichen zu verwendende Zeichen, Standard ist \ |
[edit] Rückgabewert
Gibt ein Objekt unbekannten Typs zurück, für das das beschriebene Verhalten stattfindet.
[edit] Ausnahmen
Wirft std::ios_base::failure, wenn operator>> oder operator<< wirft.
[edit] Hinweise
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_quoted_string_io |
201304L |
(C++14) | std::quoted
|
[edit] Beispiel
Führen Sie diesen Code aus
#include <iomanip> #include <iostream> #include <sstream> void default_delimiter() { const std::string in = "std::quoted() quotes this string and embedded \"quotes\" too"; std::stringstream ss; ss << std::quoted(in); std::string out; ss >> std::quoted(out); std::cout << "Default delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } void custom_delimiter() { const char delim{'$'}; const char escape{'%'}; const std::string in = "std::quoted() quotes this string and embedded $quotes$ $too"; std::stringstream ss; ss << std::quoted(in, delim, escape); std::string out; ss >> std::quoted(out, delim, escape); std::cout << "Custom delimiter case:\n" "read in [" << in << "]\n" "stored as [" << ss.str() << "]\n" "written out [" << out << "]\n\n"; } int main() { default_delimiter(); custom_delimiter(); }
Ausgabe
Default delimiter case: read in [std::quoted() quotes this string and embedded "quotes" too] stored as ["std::quoted() quotes this string and embedded \"quotes\" too"] written out [std::quoted() quotes this string and embedded "quotes" too] Custom delimiter case: read in [std::quoted() quotes this string and embedded $quotes$ $too] stored as [$std::quoted() quotes this string and embedded %$quotes%$ %$too$] written out [std::quoted() quotes this string and embedded $quotes$ $too]
[edit] Siehe auch
| (C++20) |
speichert die formatierte Darstellung der Argumente in einem neuen String (Funktionstemplate) |