Délimiteurs personnalisés pour le cin de C
Problème :
Lors de l'utilisation de cin après la redirection dans un flux de fichiers (via cin.rdbuf(inF.rdbug())), il le lit jusqu'à atteindre un espace blanc. Est-il possible d'utiliser un délimiteur alternatif ?
Réponse :
Oui, il est possible de changer le délimiteur inter-mots pour cin (ou tout autre std :: istream) en utilisant std::ios_base::imbue et une facette ctype personnalisée.
Une facette personnalisée qui traite les deux-points (:) et les nouvelles lignes comme caractères d'espacement peuvent être utilisés pour lire des fichiers comme /etc/passwd, où les champs sont séparés par des deux-points.
#include <locale> #include <iostream> struct colon_is_space : std::ctype<char> { colon_is_space() : std::ctype<char>(get_table()) {} static mask const* get_table() { static mask rc[table_size]; rc[':'] = std::ctype_base::space; rc['\n'] = std::ctype_base::space; return &rc[0]; } }; int main() { using std::string; using std::cin; using std::locale; cin.imbue(locale(cin.getloc(), new colon_is_space)); string word; while (cin >> word) { std::cout << word << "\n"; } }
En appliquant cette facette personnalisée au flux d'entrée, cin va désormais interpréter les deux-points et les nouvelles lignes comme délimiteurs de mots, permettant la séparation des champs dans des fichiers comme /etc/passwd.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!