Si desea utilizar una entrada formateada, debe saber de antemano qué datos esperar y leerlos en variables del tipo de datos correspondiente. Por ejemplo, si se sabe que el número es siempre el quinto modo, como en el ejemplo, se puede hacer esto:
std::string s1, s2, s3, s4;
int n;
std::ifstream in("outdummy.txt");
if (in >> s1 >> s2 >> s3 >> s4 >> n)
{
std::cout << "We read the number " << n << std::endl;
}
Por otro lado, si se sabe que el número es siempre en la tercera línea, por sí mismo:
std::string line;
std::getline(in, line); // have line 1
std::getline(in, line); // have line 2
std::getline(in, line); // have line 3
std::istringstream iss(line);
if (iss >> n)
{
std::cout << "We read the number " << n << std::endl;
}
como se puede ver, para leer un token como una cadena, que acaba de transmitir en un std::string
. Es importante recordar que el operador de entrada formateado trabaja token por token, y tokens están separados por espacios en blanco (espacios, pestañas, nuevas líneas). La elección fundamental habitual es si procesa un archivo completamente en tokens (primera versión) o línea por línea (segunda versión). Para el procesamiento línea por línea, primero usa getline
para leer una línea en una cadena, y luego usa una secuencia de cadenas para tokenizar la cadena.
Una palabra acerca de la validación: No se puede saber si una extracción con formato realmente tener éxito, porque eso depende de los datos de entrada. Por lo tanto, debe siempre verificar si una operación de entrada tuvo éxito, y cancelar el análisis si no lo hace, porque en caso de falla sus variables no contendrán los datos correctos, pero no tiene forma de saberlo más tarde. Así que siempre decirlo así:
if (in >> v) { /* ... */ } // v is some suitable variable
else { /* could not read into v */ }
if (std::getline(in, line)) { /* process line */ }
else { /* error, no line! */ }
La última construcción se utiliza generalmente en un bucle while
, para leer un archivo línea por línea entera:
while (std::getline(in, line)) { /* process line */ }
Su ejemplo es incorrecto; ni siquiera "lees el entero correctamente". De hecho, esa línea falla y 'a' no cambia, pero por alguna razón ya la inicializaste al valor esperado, por lo que te has vendado los ojos. –
@Kerrek tiene razón. Y es [provisto] (http://stackoverflow.com/questions/7443787/using-c-ifstream-extraction-operator-to-read-formatted-data-from-a-file/7443877#7443877) el correcto y fácil para usar la solución: 'getline' con' string'. –
¿Por qué 'char []'? ¿Por qué no 'std :: string'? –