¿Por qué la entrada de cadena std::cin me pregunta por cada espacio?

Esta semana comencé a estudiar archivos de texto en C ++ y en mi ejercicio tengo que hacer un programa para que el usuario ingrese las líneas en el archivo, pero ... para cada espacio que ingresa el usuario, el programa pregunta el nuevo al usuario.

Aquí está mi código:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(void){
    ofstream myfile;
    string answer;

    do{
        cout << "Insert a line in the file[END to finalize]: ";
        cin >> answer;
        myfile.open("example.txt");
        myfile << answer;
        myfile.close();
    }while(answer != "END");
}

El resultado es:

Inserte una línea en el archivo [FIN para finalizar]: Hola mi amigo

Insertar una línea en el archivo[FIN para finalizar]: Insertar una línea en el archivo[FIN para finalizar]: Insertar una línea en el archivo[FIN para finalizar]:

preguntado el 22 de mayo de 12 a las 19:05

Pero ¿cuál es el problema? Por cierto, al hacerlo, si el usuario escribe FIN la primera vez, entonces se escribirá "FIN" en el archivo:

¿Cuál es la pregunta? Ha descrito un poco su error y se debe a que el delimitador predeterminado es un espacio. Considere usar getline en su lugar, puede pasar al siguiente problema. -

2 Respuestas

operator>>(istream&, string&) básicamente toma la siguiente palabra. Si quieres tomar una línea completa, prueba std::getline(std::cin, answer);.

getline Sin embargo, no incluirá la nueva línea. Lo que significa que tendrás que hacer algo como myfile << answer << '\n'; para generarlos como líneas.

Por cierto, en la mayoría de los casos, querrá abrir el archivo fuera del ciclo o abrirlo para agregarlo con algo como myfile.open("example.txt", ios::app);. Al abrir el archivo en el bucle cada vez que lo hace, estoy bastante seguro de que coloca el puntero del archivo al principio del archivo, de modo que cada línea que escriba sobrescribirá al menos la primera parte de la línea anterior.

contestado el 22 de mayo de 12 a las 20:05

Sí, descarta el delimitador - por defecto \n http://www.cplusplus.com/reference/iostream/istream/getline/ - Matt

cin >> answer leerá una palabra, delimitada por espacios en blanco. Si desea leer una línea completa, utilice getline(cin, answer)

contestado el 22 de mayo de 12 a las 20:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.