Estoy codificando un programa que lee datos directamente desde la entrada del usuario y me preguntaba cómo podría (sin bucles) leer todos los datos hasta EOF desde la entrada estándar. Estaba considerando usar cin.get( input, '\0' )
pero '\0'
no es realmente el caracter EOF, eso solo lee hasta EOF o '\0'
, lo que ocurra primero.
¿O es el uso de bucles la única manera de hacerlo? Si es así, ¿cuál es la mejor manera?
La única forma de leer una cantidad variable de datos de stdin es usando bucles. Siempre he encontrado que la función std::getline()
funciona muy bien:
std::string line;
while (std::getline(std::cin, line))
{
std::cout << line << std::endl;
}
Por defecto getline() lee hasta una nueva línea. Puede especificar un carácter de terminación alternativo, pero EOF no es en sí mismo un carácter, por lo que no puede simplemente hacer una llamada a getline().
Puedes hacerlo sin bucles explícitos utilizando iteradores de flujo. Estoy seguro de que utiliza algún tipo de bucle internamente.
#include <string>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
int main()
{
// don't skip the whitespace while reading
std::cin >> std::noskipws;
// use stream iterators to copy the stream to a string
std::istream_iterator<char> it(std::cin);
std::istream_iterator<char> end;
std::string results(it, end);
std::cout << results;
}
Puede utilizar la función std::istream::getline() (o preferiblemente la versión que funciona con std::string) para obtener una línea entera. Ambas tienen versiones que permiten especificar el delimitador (carácter de fin de línea). El valor por defecto para la versión string es '\n'.