Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) erro no método getline(cin, texto)


blockmonork

Pergunta

Pessoal, estou com o seguinte problema:

no código abaixo, quando eu chamo o método "getline(cin, texto);" para ler uma string fornecida pelo usuario, o programa recebe o número normalmente, mas pula a etapa do texto, voltando pro main.

Mudei para "cin>>texto;" que embora seja errado para este caso, fiz pra ver o programa funcionar. Mas já que a variável texto é uma string e não um char, acontece do programa entrar num loop infinito quando o usuário digita um texto contento espaços.

O que pode ser isso???

Obrigado a todos pela atenção.

Agora, o código completo:


#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int FuncaoNos () {
int numero;
string texto;

cout <<"\n Digite um numero qqer";
cin >>numero;
cout <<"\n Digite um texto";
cin >> texto; // AQUI ESTÁ O PROBLEMA: O CORRETO PARA LER A STRING COM ESPAÇOS, SERIA getline(cin, texto); MAS USANDO ELE, O PROGRAMA PULA ESSA PARTE E VOLTA PRA MAIN.
ofstream reescreve;
reescreve.open("Config.xml");
reescreve<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
reescreve<<"<Config>\n";
reescreve<<"<Entrada numero=\""<<numero<<"\" texto=\""<<texto<<"\"/>\n";
reescreve<<"</Config>\n";
reescreve.close();
cout<<"\n\nArquivo XML editado.\n";
cout<<"--------------------------\n";
return 0;
}

// ----------------- M A I N
int main(){
int escolha;
int loop = 1;
if ( loop == 1 ) {
loop = 1;
while ( loop != 0 ) {
cout<<"\n Digite: \" 1 \" para escrever no xml, ou \" 0 \" para encerrar o programa: ";
cin >> escolha;
if ( escolha != 0 ) {
cout<<"\nMetodo de escrita...";
if ( escolha == 1 ) { // sem app
FuncaoNos ();
}
else if (( escolha != 1)||( escolha != 0)) {
cout<<"\n é pra digitar 1 ou 0 somente!";
}
} // escolha dif 0
else if ( escolha == 0 ) {
cout<<"\nPrograma fechado pelo usuario.\n";
cout<<"----------------\n";
loop = 0;
}
} // UAILI
if ( loop == 1 )
loop = 1;
else
loop = 0;
} // uaili
system("PAUSE");
return EXIT_SUCCESS;
}
[/CODEBOX]

Editado por Mônica Bonna
Codebox
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

Olá blockmonork,

Você terá que incluir a biblioteca stdio.h, declarar a variável texto como char e coloque até quantas letras ela vai poder ter pra você digitar mais de uma letra, no caso um texto. Depois onde tem cin >> texto, você subistitui por gets(texto); e de novo gets(texto). Terá dois gets(texto), um em baixo do outro. Compilei aki e deu certo. Vou postar o código modificado, você copia e cola aí pra ver se vai dar certo.

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

int FuncaoNos () {
int numero;
char texto[50];

cout <<"\n Digite um numero qqer";
cin >>numero;
cout <<"\n Digite um texto";
gets(texto);
gets(texto);

ofstream reescreve;
reescreve.open("Config.xml");
reescreve<<"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
reescreve<<"<Config>\n";
reescreve<<"<Entrada numero=\""<<numero<<"\" texto=\""<<texto<<"\"/>\n";
reescreve<<"</Config>\n";
reescreve.close();
cout<<"\n\nArquivo XML editado.\n";
cout<<"--------------------------\n";
return 0;
}

// ----------------- M A I N
int main(){
int escolha;
int loop = 1;
if ( loop == 1 ) {
loop = 1;
while ( loop != 0 ) {
cout<<"\n Digite: \" 1 \" para escrever no xml, ou \" 0 \" para encerrar o programa: ";
cin >> escolha;
if ( escolha != 0 ) {
cout<<"\nMetodo de escrita...";
if ( escolha == 1 ) { // sem app
FuncaoNos ();
}
else if (( escolha != 1)||( escolha != 0)) {
cout<<"\n é pra digitar 1 ou 0 somente!";
}
} // escolha dif 0
else if ( escolha == 0 ) {
cout<<"\nPrograma fechado pelo usuario.\n";
cout<<"----------------\n";
loop = 0;
}
} // UAILI
if ( loop == 1 )
loop = 1;
else
loop = 0;
} // uaili
system("PAUSE");
return EXIT_SUCCESS;
}[/CODEBOX]

no char texto[50], o 50 entre colchetes é o número de letras que a variável pode ter, coloquei 50 só para exemplo, como é um texto talvez precise de mais, aí fica a seu critério, você pode colocar quantas quiser.

...É isso aí cara, qualquer dúvida posta aí. Depois posta tb se deu certo, se funcionou direitinho. falou T+ . . . . :)

Editado por Risadão
Link para o comentário
Compartilhar em outros sites

  • 0

Texto é uma string.

O getline recebe um char.

Modo correto de ler para um std::string.

#include <iostream>

int main(void) {
    char text[1024];
    std::string x;
    
    std::cin.getline(text, 1024); /* input: alou (exemplo) */
    std::cout << text << std::endl; /* output: alou */
    x = text;
    std::cout << x; /* output: alou */

    std::cin.get();
    return 0;
}

Abraços.

Link para o comentário
Compartilhar em outros sites

  • 0

Valeu, Risadão e Durub pelas dicas!

Funcionou perfeitamente!

Porém, ainda não entendo o por que do metodo getline funcionar dentro de main mas não funcionar quando eu o coloco em uma função fora de main....

Vou utilizar o método sugerido por vocês, mas fica ai a pergunta...(mesmo que a título de curiosidade) :)

Obrigado a todos pela atenção.

abs

Link para o comentário
Compartilhar em outros sites

  • 0

Olá blockmonork

Mesmo os outros usuários terem resolvido o seu problema, nenhum indicou o porquê do erro.

Vou te explicar o erro e como soluciona-lo apenas acrescentando uma linha.

Apesar de getline() funcionar quando os dados de cadeia são lidos de modo consecutivo, problemas serão apresentados ao se tentar utilizar uma variavel de cadeia, depois de ter utilizado cin para ler uma variável caractere ou numérica. (Foi o que você fez. Usou o cin pra ler numero e depois tentou usar getline() isso gera o erro).

A razão dessa anomalia, é que ao entrarmos com o numero no cin>> precionamos a tecla ENTER em seguida. Essa ação insere um caractere CRLF (retorno do carro / avanço de linha (é o '\n')) e permanece no buffer. Quando se executa a sentença getline, lê-se o buffer e se encontra o caractere CRLF; dado que este é, por default, o caractere de separação, detém-se a leitura e se insere o caractere de terminação nulo na cadeia. Por conseguinte, não se pode introduzir o texto.

a forma mais simples de solucionar o problema, é usar o comando cin.ignore() antes de usar o getline. Ex.:

int numero;

string texto;

cout<<"Digite um numero: ";

cin>>numero;

cin.ignore(); // limpa o buffer

cout<<"Digite o texto: ";

getline(cin,texto);

Link para o comentário
Compartilhar em outros sites

  • 0
Em 17/03/2009 em 23:47, Andre Eng. Computação disse:

Olá blockmonork

 

Mesmo os outros usuários terem resolvido o seu problema, nenhum indicou o porquê do erro.

Vou te explicar o erro e como soluciona-lo apenas acrescentando uma linha.

 

Apesar de getline() funcionar quando os dados de cadeia são lidos de modo consecutivo, problemas serão apresentados ao se tentar utilizar uma variavel de cadeia, depois de ter utilizado cin para ler uma variável caractere ou numérica. (Foi o que você fez. Usou o cin pra ler numero e depois tentou usar getline() isso gera o erro).

 

A razão dessa anomalia, é que ao entrarmos com o numero no cin>> precionamos a tecla ENTER em seguida. Essa ação insere um caractere CRLF (retorno do carro / avanço de linha (é o '\n')) e permanece no buffer. Quando se executa a sentença getline, lê-se o buffer e se encontra o caractere CRLF; dado que este é, por default, o caractere de separação, detém-se a leitura e se insere o caractere de terminação nulo na cadeia. Por conseguinte, não se pode introduzir o texto.

 

a forma mais simples de solucionar o problema, é usar o comando cin.ignore() antes de usar o getline. Ex.:

 

int numero;

string texto;

 

cout<<"Digite um numero: ";

cin>>numero;

cin.ignore(); // limpa o buffer

cout<<"Digite o texto: ";

getline(cin,texto);

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...