Buscar..


Introducción

Los manipuladores son funciones auxiliares especiales que ayudan a controlar los flujos de entrada y salida utilizando el operator >> o el operator << .

Todos ellos pueden ser incluidos por #include <iomanip> .

Observaciones

Los manipuladores se pueden utilizar de otra manera. Por ejemplo:

  1. os.width(n); es igual a os << std::setw(n);
    is.width(n); igual a is >> std::setw(n);

  1. os.precision(n); es igual a os << std::setprecision(n);
    is.precision(n); igual a is >> std::setprecision(n);

  1. os.setfill(c); es igual a os << std::setfill(c);

  1. str >> std::setbase(base); o str << std::setbase(base); igual a
str.setf(base ==  8 ? std::ios_base::oct :
            base == 10 ? std::ios_base::dec :
                base == 16 ? std::ios_base::hex :
                     std::ios_base::fmtflags(0),
         std::ios_base::basefield);

  1. os.setf(std::ios_base::flag); es igual a os << std::flag;
    is.setf(std::ios_base::flag); es igual a is >> std::flag;

    os.unsetf(std::ios_base::flag); es igual a os << std::no ## flag;
    is.unsetf(std::ios_base::flag); es igual a is >> std::no ## flag;

    (donde ## - es el operador de concatenación )

    para la siguiente flag s: boolalpha , showbase , showpoint , showpos , skipws , uppercase .

  1. std::ios_base::basefield .
    Para flag s: dec , hex y oct :
  • os.setf(std::ios_base::flag, std::ios_base::basefield); es igual a os << std::flag;
    is.setf(std::ios_base::flag, std::ios_base::basefield); es igual a is >> std::flag;
    (1)

  • str.unsetf(std::ios_base::flag, std::ios_base::basefield); es igual a str.setf(std::ios_base::fmtflags(0), std::ios_base::basefield);
    (2)

  1. std::ios_base::adjustfield .
    Para flag s: left , right e internal :
  • os.setf(std::ios_base::flag, std::ios_base::adjustfield); es igual a os << std::flag;
    is.setf(std::ios_base::flag, std::ios_base::adjustfield); es igual a is >> std::flag;
    (1)

  • str.unsetf(std::ios_base::flag, std::ios_base::adjustfield); es igual a str.setf(std::ios_base::fmtflags(0), std::ios_base::adjustfield);
    (2)

(1) Si la bandera del campo correspondiente previamente establecido ya se ha desactivado por unsetf .
(2) Si se establece la flag .

  1. std::ios_base::floatfield .
  • os.setf(std::ios_base::flag, std::ios_base::floatfield); es igual a os << std::flag;
    is.setf(std::ios_base::flag, std::ios_base::floatfield); es igual a is >> std::flag;

    Para flag s: fixed y scientific .

  • os.setf(std::ios_base::fmtflags(0), std::ios_base::floatfield); es igual a os << std::defaultfloat;
    is.setf(std::ios_base::fmtflags(0), std::ios_base::floatfield); igual a is >> std::defaultfloat;

  1. str.setf(std::ios_base::fmtflags(0), std::ios_base::flag); es igual a str.unsetf(std::ios_base::flag)

    para la flag s: basefield , adjustfield basefield , adjustfield floatfield .

  1. os.setf(mask) es igual a os << setiosflags(mask);
    is.setf(mask) es igual a is >> setiosflags(mask);

    os.unsetf(mask) es igual a os << resetiosflags(mask);
    is.unsetf(mask) es igual a is >> resetiosflags(mask);

    Para casi todas las mask de tipo std::ios_base::fmtflags .

Manipuladores de corriente

std::boolalpha and std::noboolalpha - cambia entre la representación textual y numérica de los booleanos.

std::cout << std::boolalpha << 1;
// Output: true

std::cout << std::noboolalpha << false;
// Output: 0

bool boolValue;
std::cin >> std::boolalpha >> boolValue;
std::cout << "Value \"" << std::boolalpha << boolValue
          << "\" was parsed as " << std::noboolalpha << boolValue;
// Input: true
// Output: Value "true" was parsed as 0

std::showbase y std::noshowbase - controlan si se usa el prefijo que indica la base numérica.

std::dec (decimal), std::hex (hexadecimal) y std::oct (octal) - se usan para cambiar la base de enteros.

#include <sstream>

std::cout << std::dec << 29 << ' - '
          << std::hex << 29 << ' - '
          << std::showbase << std::oct << 29 << ' - '
          << std::noshowbase << 29  '\n';
int number;
std::istringstream("3B") >> std::hex >> number;
std::cout << std::dec << 10;
// Output: 22 - 1D - 35 - 035
// 59

Los valores predeterminados son std::ios_base::noshowbase y std::ios_base::dec .

Si desea ver más información sobre std::istringstream consulte el encabezado < sstream >.


std::uppercase y std::nouppercase - controlan si los caracteres en mayúsculas se utilizan en coma flotante y en la salida de enteros hexadecimales. No tiene efecto en los flujos de entrada.

std::cout << std::hex << std::showbase
              << "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n'
              << "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n'
}
// Output: 0x2a with nouppercase: 0x2a
// 1e-10 with uppercase: 1E-10

El valor predeterminado es std::nouppercase .


std::setw(n) : cambia el ancho del siguiente campo de entrada / salida a n exactamente.

La propiedad de ancho n se restablece a 0 cuando se llaman algunas funciones (la lista completa está aquí ).

std::cout << "no setw:" << 51 << '\n'
          << "setw(7): " << std::setw(7) << 51 << '\n'
          << "setw(7), more output: " << 13
          << std::setw(7) << std::setfill('*') << 67 << ' ' << 94 << '\n';

char* input = "Hello, world!";
char arr[10];
std::cin >> std::setw(6) >> arr;
std::cout << "Input from \"Hello, world!\" with setw(6) gave \"" << arr << "\"\n";

// Output: 51
// setw(7):      51
// setw(7), more output: 13*****67 94

// Input: Hello, world!
// Output: Input from "Hello, world!" with setw(6) gave "Hello"

El valor predeterminado es std::setw(0) .


std::left , std::right y std::internal - modifique la posición predeterminada de los caracteres de relleno configurando std::ios_base::adjustfield a std::ios_base::left , std::ios_base::right y std::ios_base::internal correspondiente. std::left y std::right aplican a cualquier salida, std::internal - para entero, punto flotante y salida monetaria. No tiene efecto en los flujos de entrada.

#include <locale>
...

std::cout.imbue(std::locale("en_US.utf8"));

std::cout << std::left << std::showbase << std::setfill('*')
          << "flt: " << std::setw(15) << -9.87  << '\n'
          << "hex: " << std::setw(15) << 41 << '\n'
          << "  $: " << std::setw(15) << std::put_money(367, false) << '\n'
          << "usd: " << std::setw(15) << std::put_money(367, true) << '\n'
          << "usd: " << std::setw(15)
          << std::setfill(' ') << std::put_money(367, false) << '\n';
// Output:
// flt: -9.87**********
// hex: 41*************
//   $: $3.67**********
// usd: USD *3.67******
// usd: $3.67          

std::cout << std::internal << std::showbase << std::setfill('*')
          << "flt: " << std::setw(15) << -9.87  << '\n'
          << "hex: " << std::setw(15) << 41 << '\n'
          << "  $: " << std::setw(15) << std::put_money(367, false) << '\n'
          << "usd: " << std::setw(15) << std::put_money(367, true) << '\n'
          << "usd: " << std::setw(15)
          << std::setfill(' ') << std::put_money(367, true) << '\n';
// Output:
// flt: -**********9.87
// hex: *************41
//   $: $3.67**********
// usd: USD *******3.67
// usd: USD        3.67

std::cout << std::right << std::showbase << std::setfill('*')
          << "flt: " << std::setw(15) << -9.87  << '\n'
          << "hex: " << std::setw(15) << 41 << '\n'
          << "  $: " << std::setw(15) << std::put_money(367, false) << '\n'
          << "usd: " << std::setw(15) << std::put_money(367, true) << '\n'
          << "usd: " << std::setw(15)
          << std::setfill(' ') << std::put_money(367, true) << '\n';
// Output:
// flt: **********-9.87
// hex: *************41
//   $: **********$3.67
// usd: ******USD *3.67
// usd:       USD  3.67

El valor predeterminado es std::left .


std::fixed , std::scientific , std::hexfloat [C ++ 11] y std::defaultfloat [C ++ 11] - cambia el formato de entrada / salida de punto flotante.

std::fixed configura std::ios_base::floatfield to std::ios_base::fixed ,
std::scientific - to std::ios_base::scientific ,
std::hexfloat - a std::ios_base::fixed | std::ios_base::scientific y
std::defaultfloat - to std::ios_base::fmtflags(0) .

fmtflags

#include <sstream>
...

std::cout << '\n'
          << "The number 0.07 in fixed:      " << std::fixed << 0.01 << '\n'
          << "The number 0.07 in scientific: " << std::scientific << 0.01 << '\n'
          << "The number 0.07 in hexfloat:   " << std::hexfloat << 0.01 << '\n'
          << "The number 0.07 in default:    " << std::defaultfloat << 0.01 << '\n';

double f;
std::istringstream is("0x1P-1022");
double f = std::strtod(is.str().c_str(), NULL);
std::cout << "Parsing 0x1P-1022 as hex gives " << f << '\n';

// Output:
// The number 0.01 in fixed:      0.070000
// The number 0.01 in scientific: 7.000000e-02
// The number 0.01 in hexfloat:   0x1.1eb851eb851ecp-4
// The number 0.01 in default:    0.07
// Parsing 0x1P-1022 as hex gives 2.22507e-308

El valor predeterminado es std::ios_base::fmtflags(0) .

Hay un error en algunos compiladores que causa

double f;
std::istringstream("0x1P-1022") >> std::hexfloat >> f;
std::cout << "Parsing 0x1P-1022 as hex gives " << f << '\n';
// Output: Parsing 0x1P-1022 as hex gives 0

std::showpoint y std::noshowpoint : controlan si el punto decimal siempre se incluye en la representación de punto flotante. No tiene efecto en los flujos de entrada.

std::cout << "7.0 with showpoint: " << std::showpoint << 7.0 << '\n'
          << "7.0 with noshowpoint: " << std::noshowpoint << 7.0 << '\n';
// Output: 1.0 with showpoint: 7.00000
// 1.0 with noshowpoint: 7

El valor predeterminado es std::showpoint .


std::showpos y std::noshowpos : controlan la visualización del signo + en la salida no negativa . No tiene efecto en los flujos de entrada.

std::cout << "With showpos: " << std::showpos
          << 0 << ' ' << -2.718 << ' ' << 17 << '\n'
          << "Without showpos: " << std::noshowpos
          << 0 << ' ' << -2.718 << ' ' << 17 << '\n';
// Output: With showpos: +0 -2.718 +17
// Without showpos: 0 -2.718 17

Predeterminado if std::noshowpos .


std::unitbuf , std::nounitbuf - controla el flujo de salida de descarga después de cada operación. No tiene efecto en el flujo de entrada. std::unitbuf causa enrojecimiento.


std::setbase(base) : establece la base numérica de la secuencia.

std::setbase(8) equivale a configurar std::ios_base::basefield a std::ios_base::oct ,
std::setbase(16) - a std::ios_base::hex ,
std::setbase(10) - a std::ios_base::dec .

Si la base es distinta de 8 , 10 o 16 entonces std::ios_base::basefield se establece en std::ios_base::fmtflags(0) . Significa salida decimal y entrada dependiente del prefijo.

Como predeterminado std::ios_base::basefield es std::ios_base::dec luego por defecto std::setbase(10) .


std::setprecision(n) - cambia la precisión del punto flotante.

#include <cmath>
#include <limits>
...

typedef std::numeric_limits<long double> ld;
const long double pi = std::acos(-1.L);

std::cout << '\n'
          << "default precision (6):   pi: " << pi << '\n'
          << "                       10pi: " << 10 * pi << '\n'
          << "std::setprecision(4):  10pi: " << std::setprecision(4) << 10 * pi << '\n'
          << "                    10000pi: " << 10000 * pi << '\n'
          << "std::fixed:         10000pi: " << std::fixed << 10000 * pi << std::defaultfloat << '\n'
          << "std::setprecision(10):   pi: " << std::setprecision(10) << pi << '\n'
          << "max-1 radix precicion:   pi: " << std::setprecision(ld::digits - 1) << pi << '\n'
          << "max+1 radix precision:   pi: " << std::setprecision(ld::digits + 1) << pi << '\n'
          << "significant digits prec: pi: " << std::setprecision(ld::digits10) << pi << '\n';

// Output:
// default precision (6):   pi: 3.14159
//                        10pi: 31.4159
// std::setprecision(4):  10pi: 31.42
//                     10000pi: 3.142e+04
// std::fixed:         10000pi: 31415.9265
// std::setprecision(10):   pi: 3.141592654
// max-1 radix precicion:   pi: 3.14159265358979323851280895940618620443274267017841339111328125
// max+1 radix precision:   pi: 3.14159265358979323851280895940618620443274267017841339111328125
// significant digits prec: pi: 3.14159265358979324

El valor predeterminado es std::setprecision(6) .


std::setiosflags(mask) y std::resetiosflags(mask) - establece y borra las banderas especificadas en la mask de tipo std::ios_base::fmtflags .

#include <sstream>
...

std::istringstream in("10 010 10 010 10 010");
int num1, num2;

in >> std::oct >> num1 >> num2;
std::cout << "Parsing \"10 010\" with std::oct gives:   " << num1 << ' ' << num2 << '\n';
// Output: Parsing "10 010" with std::oct gives:   8 8

in >> std::dec >> num1 >> num2;
std::cout << "Parsing \"10 010\" with std::dec gives:   " << num1 << ' ' << num2 << '\n';
// Output: Parsing "10 010" with std::oct gives:   10 10

in >> std::resetiosflags(std::ios_base::basefield) >> num1 >> num2;
std::cout << "Parsing \"10 010\" with autodetect gives: " << num1 << ' ' << num2 << '\n';
// Parsing "10 010" with autodetect gives: 10 8

std::cout << std::setiosflags(std::ios_base::hex |
                              std::ios_base::uppercase |
                              std::ios_base::showbase) << 42 << '\n';
// Output: OX2A

std::skipws and std::noskipws : controle la omisión de los espacios en blanco std::noskipws mediante las funciones de entrada con formato. No tiene efecto en las corrientes de salida.

#include <sstream>
...

char c1, c2, c3;
std::istringstream("a b c") >> c1 >> c2 >> c3;
std::cout << "Default  behavior:  c1 = " << c1 << "  c2 = " << c2 << "  c3 = " << c3 << '\n';

std::istringstream("a b c") >> std::noskipws >> c1 >> c2 >> c3;
std::cout << "noskipws behavior:  c1 = " << c1 << "  c2 = " << c2 << "  c3 = " << c3 << '\n';
// Output: Default  behavior:  c1 = a  c2 = b  c3 = c
// noskipws behavior:  c1 = a  c2 =    c3 = b

El valor predeterminado es std::ios_base::skipws .


std::quoted(s[, delim[, escape]]) [C ++ 14]: inserta o extrae cadenas citadas con espacios incrustados.

s - la cadena para insertar o extraer.
delim : el carácter a usar como delimitador, " por defecto.
escape : el carácter a usar como el carácter de escape, \ por defecto.

#include <sstream>
...
 
std::stringstream ss;
std::string in = "String with spaces, and embedded \"quotes\" too";
std::string out;
 
ss << std::quoted(in);
std::cout << "read in     [" << in << "]\n"
          << "stored as   [" << ss.str() << "]\n";
 
ss >> std::quoted(out);
std::cout << "written out [" << out << "]\n";
// Output:
// read in     [String with spaces, and embedded "quotes" too]
// stored as   ["String with spaces, and embedded \"quotes\" too"]
// written out [String with spaces, and embedded "quotes" too]

Para más información vea el enlace de arriba.

Manipuladores de flujo de salida

std::ends : inserta un carácter nulo '\0' en el flujo de salida. Más formalmente la declaración de este manipulador parece

template <class charT, class traits>
std::basic_ostream<charT, traits>& ends(std::basic_ostream<charT, traits>& os);

y este manipulador coloca el carácter llamando a os.put(charT()) cuando se usa en una expresión
os << std::ends;


std::endl y std::flush ambos out.flush() flujo de out llamando a out.flush() . Provoca producción inmediata. Pero std::endl inserta el std::endl final de línea '\n' antes de vaciar.

std::cout << "First line." << std::endl << "Second line. " << std::flush
          << "Still second line.";
// Output: First line.
// Second line. Still second line.

std::setfill(c) - cambia el carácter de relleno a c . A menudo se utiliza con std::setw .

std::cout << "\nDefault fill: " << std::setw(10) << 79 << '\n'
          << "setfill('#'): " << std::setfill('#')
          << std::setw(10) << 42 << '\n';
// Output:
// Default fill:         79
// setfill('#'): ########79

std::put_money(mon[, intl]) [C ++ 11]. En una expresión out << std::put_money(mon, intl) , convierte el valor monetario mon (del tipo long double o std::basic_string ) en su representación de caracteres según lo especificado por la faceta std::money_put del locale actualmente imbuido en out Use cadenas internacionales de moneda si intl es true , use símbolos de moneda de lo contrario.

long double money = 123.45;
// or std::string money = "123.45";
 
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << std::showbase << "en_US: " << std::put_money(money)
          << " or " << std::put_money(money, true) << '\n';
// Output: en_US: $1.23 or USD  1.23
 
std::cout.imbue(std::locale("ru_RU.utf8"));
std::cout << "ru_RU: " << std::put_money(money)
          << " or " << std::put_money(money, true) << '\n';
// Output: ru_RU: 1.23 руб or 1.23 RUB 
 
std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_money(money)
          << " or " << std::put_money(money, true) << '\n';
// Output: ja_JP: ¥123 or JPY  123

std::put_time(tmb, fmt) [C ++ 11]: formatea y genera un valor de fecha / hora en std::tm acuerdo con el formato especificado fmt .

tmb : puntero a la estructura horaria del calendario const std::tm* según se obtiene de localtime() o gmtime() .
fmt : puntero a una cadena de caracteres terminada en const CharT* especifica el formato de conversión.

#include <ctime>
...

std::time_t t = std::time(nullptr);
std::tm tm = *std::localtime(&t);

std::cout.imbue(std::locale("ru_RU.utf8"));
std::cout << "\nru_RU: " << std::put_time(&tm, "%c %Z") << '\n';
// Possible output:
// ru_RU: Вт 04 июл 2017 15:08:35 UTC

Para más información vea el enlace de arriba.

Manipuladores de flujo de entrada

std::ws : consume espacios en blanco iniciales en el flujo de entrada. Es diferente de std::skipws .

#include <sstream>
...

std::string str;
std::istringstream("  \v\n\r\t    Wow!There   is no whitespaces!") >> std::ws >> str;
std::cout << str;
// Output: Wow!There   is no whitespaces!

std::get_money(mon[, intl]) [C ++ 11]. En una expresión in >> std::get_money(mon, intl) analiza la entrada del carácter como un valor monetario, según lo especificado por la faceta std::money_get del entorno local imbuido actualmente in , y almacena el valor en mon (de long double o std::basic_string type). El manipulador espera las cadenas de moneda internacionales requeridas si intl es true , de lo contrario espera símbolos de moneda opcionales .

#include <sstream>
#include <locale>
...
 
std::istringstream in("$1,234.56 2.22 USD  3.33");
long double v1, v2;
std::string v3;

in.imbue(std::locale("en_US.UTF-8"));
in >> std::get_money(v1) >> std::get_money(v2) >> std::get_money(v3, true);
if (in) {
    std::cout << std::quoted(in.str()) << " parsed as: "
              << v1 << ", " << v2 << ", " << v3 << '\n';
}
// Output:
// "$1,234.56 2.22 USD  3.33" parsed as: 123456, 222, 333

std::get_time(tmb, fmt) [C ++ 11] - analiza un valor de fecha / hora almacenado en tmb del formato especificado fmt .

tmb : puntero válido al objeto const std::tm* donde se almacenará el resultado.
fmt : puntero a una cadena de caracteres terminada en const CharT* especifica el formato de conversión.

#include <sstream>
#include <locale>
...

std::tm t = {};
std::istringstream ss("2011-Februar-18 23:12:34");

ss.imbue(std::locale("de_DE.utf-8"));
ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
if (ss.fail()) {
    std::cout << "Parse failed\n";
}
else {
    std::cout << std::put_time(&t, "%c") << '\n';
}
// Possible output:
// Sun Feb 18 23:12:34 2011

Para más información vea el enlace de arriba.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow