Justificar correctamente la salida en C++

Jinku Hu 12 octubre 2023
  1. Usa std::right y std::setw para Justificar correctamente la salida en C++
  2. Usar la función printf para justificar correctamente la salida en C++
Justificar correctamente la salida en C++

Este artículo demostrará múltiples métodos sobre cómo justificar correctamente el flujo de salida en C++.

Usa std::right y std::setw para Justificar correctamente la salida en C++

La biblioteca estándar de C++ proporciona funciones de ayuda al manipulador de E/S para controlar mejor los flujos cuando se usan con operadores << >>, y se incluyen en el archivo de cabecera <iomanip>. std::right es uno de los manipuladores de flujos que establece la posición de los caracteres de relleno. Por lo tanto, debe ser usado en conjunto con la función de manipulador std::setw, que se usa para establecer el ancho del flujo. std::setw toma un único entero como argumento para especificar el número de caracteres a asignar para el ancho del flujo.

En el siguiente código de ejemplo, inicializamos un vector de double con valores arbitrarios que tienen diferente precisión y luego los emitimos todos como se justifica en el lado derecho de la consola.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    cout << right << setw(20) << fixed << i << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Producción :

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

Usar la función printf para justificar correctamente la salida en C++

Otra función poderosa para tratar con el formato de E/S es printf. Aunque printf no se usa con los flujos cin y cout, puede formatear argumentos variables por separado. Fíjate en que usamos el especificador de formato %f para los valores de punto flotante, y usamos un número arbitrario 20 para añadir caracteres de relleno a cada elemento. Como resultado, cada línea tiene un ancho de 20 caracteres, y como el número es positivo, los caracteres de relleno se añaden desde la izquierda.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%20f\n", i);
  }

  return EXIT_SUCCESS;
}

Producción :

  123.231000
    2.234300
    0.324000
    0.012000
   26.949109
11013.000000
   92.001112
    0.000000

Alternativamente, podemos insertar un entero negativo en el especificador de formato para llenar los caracteres del lado derecho, justificando la salida a la izquierda. Otra característica poderosa del printf es el formato de valores literales de cadena, como se demuestra en el siguiente código de muestra. Nótese que %c es el especificador de formato char, y el valor 0x20 es hexadecimal para un espacio.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::right;
using std::setw;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.324,     0.012,
                          26.9491092019, 11013,  92.001112, 0.000000234};

  for (auto &i : d_vec) {
    printf("%-20f\n", i);
  }

  printf("%60s\n", "this ought to be justified right");
  printf("%-20s|%20c|%20s\n", "wandering", 0x20, "the tower");

  return EXIT_SUCCESS;
}

Producción :

123.231000          
2.234300            
0.324000            
0.012000            
26.949109           
11013.000000      
92.001112           
0.000000            
                            this ought to be justified right

wandering           |                    |           the tower
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ IO