Una corriente de cuerdas
1. Información general
Todos los ejemplos de E/S que ha visto hasta ahora están escribiendo en cout o leyendo cin. Sin embargo, hay otro conjunto de clases llamadas clases de flujo de cadenas que permiten que los operadores familiares de inserción (<<) y extracción (>>) funcionen con cadenas. Al igual que istream y ostream, los flujos de cadenas proporcionan un búfer para almacenar datos. Sin embargo, a diferencia de cin y cout, estos flujos no están conectados a los canales de E/S (por ejemplo, teclado, monitor, etc.). Uno de los principales usos de los flujos de cadenas es almacenar en búfer la salida para su visualización posterior o procesar la entrada línea por línea.
Hay seis clases de flujo para cadenas: istringstream (derivado de istream), ostringstream (derivado de ostream) y stringstream (derivado de iostream) para leer y escribir cadenas ordinarias de ancho de caracteres. wistringstream, wostringstream y wstringstream se utilizan para leer y escribir cadenas anchas. Para usar secuencias de cadenas, debe #incluir el encabezado de la secuencia.
1, flujo de cuerdas
Hay dos formas de poner datos en un flujo de cadena:
1. Utilice el operador de inserción (<<):
std::stringstream os;
os << "en garde!" << '\n'; // insert "en garde!" into the stringstream
2. Utilice la función str(cadena) para establecer el valor del búfer:
std::stringstream os;
os.str("en garde!"); // set the stringstream buffer to "en garde!"
También hay dos formas de obtener datos de un flujo de cadenas:
1. Utilice la función str() para recuperar el resultado del búfer:
std::stringstream os;
os << "12345 67.89" << '\n';
std::cout << os.str();
//输出
12345 67.89
2. Utilice el operador de extracción (>>):
std::stringstream os;
os << "12345 67.89"; // insert a string of numbers into the stream
std::string strValue;
os >> strValue;
std::string strValue2;
os >> strValue2;
// print the numbers separated by a dash
std::cout << strValue << " - " << strValue2 << '\n';
//输出
12345 - 67.89
Tenga en cuenta que el operador >> itera sobre cadenas: cada uso sucesivo de >> devuelve el siguiente valor extraíble en la secuencia. Por otro lado, str() devuelve el valor completo de la secuencia, incluso si >> se ha utilizado en la secuencia.
2. Conversión entre cadenas y números
Debido a que los operadores de inserción y extracción saben cómo manejar todos los tipos de datos básicos, podemos usarlos para convertir cadenas en números y viceversa.
Primero, veamos cómo convertir números en cadenas:
std::stringstream os;
int nValue{ 12345 };
double dValue{ 67.89 };
os << nValue << ' ' << dValue;
std::string strValue1, strValue2;
os >> strValue1 >> strValue2;
std::cout << strValue1 << ' ' << strValue2 << '\n';
//输出
12345 67.89
Ahora vamos a convertir la cadena numérica en un número:
std::stringstream os;
os << "12345 67.89"; // insert a string of numbers into the stream
int nValue;
double dValue;
os >> nValue >> dValue;
std::cout << nValue << ' ' << dValue << '\n';
//输出
12345 67.89
Hay varias formas de vaciar el búfer de un flujo de cadenas.
1. Use str() con una cadena de estilo C en blanco para establecerla en una cadena vacía:
std::stringstream os;
os << "Hello ";
os.str(""); // erase the buffer
os << "World!";
std::cout << os.str();
2. Use str() con un objeto std::string en blanco para establecerlo en una cadena vacía:
std::stringstream os;
os << "Hello ";
os.str(std::string{}); // erase the buffer
os << "World!";
std::cout << os.str();
Ambos programas producen los siguientes resultados:
World!
Al borrar el flujo de cadenas, llame a la función clear():
std::stringstream os;
os << "Hello ";
os.str(""); // erase the buffer
os.clear(); // reset error flags
os << "World!";
std::cout << os.str();
clear() restablece cualquier indicador de error que se haya establecido y devuelve la transmisión a un estado normal. Hablaremos más sobre los estados de transmisión y los indicadores de error en la siguiente lección.