Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Peixoto

Entrada de dados com string e espaço

Recommended Posts

:mellow:

Quero entrar com um nome e um valor inteiro. Então fiz:

 

string Nome;
int Nota; 
while (cin >> Nome >> nota ) 
{
   //Grave o arquivo
   out << "Nome do Aluno: " << Nome << " " << "Nota: "
    << nota << endl; 
    }

Se eu entrar com:

 

Carlos 10

E der:

^z

Dá certo

 

 

Mas se eu fizer:

 

Carlos Alberto 10

E der:

^z

 

O arquivo fica em branco, cin não aceita espaço em branco, entende que a string está sendo terminada. Como resolver isso?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Tente utilizar os métodos get ou getline.

Compartilhar este post


Link para o post
Compartilhar em outros sites

:mellow:

 

Até sei que está é a solução

 

cin.getline(Nome)

 

mas não estou sabendo qual a variante certa para usar dentro da linha

 

while (cin >> Nome >> nota )

 

as tentativas que fiz deram ereo de compilação. Se puder indicar a sibtaxe certa..

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que não entendi direito a sua dúvida...

 

Seria algo assim??

 

#include	<iostream>

int main(void) {
char strTextoEntrada[100];

std::cout << "Digite uma string: ";
while(std::cin.getline(strTextoEntrada, 100, '\n'))
std::cout << std::endl << "String digitada: " << strTextoEntrada << std:: endl;

return 0;
}

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

:mellow:

 

1-Eu mudei a estratégia. Vi que com getline não dá para fazer o que quero. Então estou tentando a seguinte solução:

 

char resposta='S';
cout << "Entre com nome e valor " <<endl;
   getline(cin,Nome);
   cin >> valor;
whilhe(resposta !=’N’)

  {

   //Grave o arquivo
   out << "Nome: " << Nome << " " << "Valor: "    << valor << endl;
cout << “Outro registro S/N? “
cin  >> resposta;

   getline(cin,Nome);
    cin >> valor;
    }

Após responder SIM, entrar para com o segundo registro(Nome, valor e ENTER) para gravar os dados no arquivo, entra em loop. Por quê?

 

2- Ao fazer:

 

fstream filestr ("mostra.txt", fstream::out|fstream::in);

 filestr << "i/o operations here";
 string s;
 filestr.seekg(0);// Posiciona arquivo no início
 getline(filestr, s);

 

O arquivo mostra.txt não está sendo criado. Por quê ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Após responder SIM, entrar para com o segundo registro(Nome, valor e ENTER) para gravar os dados no arquivo, entra em loop. Por quê?

 

Eu acridito que esteja ocorrendo por sujeira no buffer de stdin, está colocando algum caracter, provavelmente o '\n', no lugar incorreto.

Existe um método do std::cin pode ajudar a evitar isto, o istream::ignore.

Desta forma:

#include <iostream>
using namespace std;

int main () {
 char first, last;

 cout << "Enter your first and last names: ";

 first=cin.get();
 cin.ignore(256,' ');

 last=cin.get();

 cout << "Your initials are " << first << last;

 return 0;
}

*segue o link de explicação do método:

http://www.cplusplus.com/reference/iostream/istream/ignore/

 

Fiz um código que utilizo os recursos que você está utilizando.

#include <iostream>
#include <fstream>

using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::fstream;

struct Aluno {
   string strNome;
   int iNota;
};

void vCapturaDados(Aluno*);
int iGravaArquivo(const Aluno*);

void vCapturaDados(Aluno* aluno) {
   char strTemp[100];

   cout << "Digite o nome e a nota do aluno: ";
   cin.getline(strTemp,100,'\n');
   aluno->strNome = strTemp;
   cin >> aluno->iNota;

   return;
}

int iGravaArquivo(const Aluno* aluno) {
   fstream fHandle("Arquivo.txt",fstream::out);
   if(!fHandle.is_open())
       // Arquivo não foi aberto, retorna erro
       return -1;

   fHandle << "Nome: " << aluno->strNome << endl << "Nota: " << aluno->iNota << '\n';

   fHandle.close();

   return 1;
}

int main(void) {
   Aluno aluno1;

   vCapturaDados(&aluno1);

#ifdef __DEBUG
   cout << "Nome: " << aluno1.strNome << endl << "Nota: " << aluno1.iNota << endl;
#endif //__DEBUG

   if(iGravaArquivo(&aluno1) < 0)
       //Arquivo não pode ser aberto
       cout << "Arquivo não pode ser aberto" << endl;

   return 0;
}

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

:rolleyes:

 

Vou fazer o teste com a função ignore, mas isso não resolve o problema da segunda questão:

 

2- Por que o arquivo não está sendo criado? Qual o erro?

 

fstream filestr ("mostra.txt", fstream::out|fstream::in);

 filestr << "i/o operations here";
 string s;
 filestr.seekg(0);// Posiciona arquivo no início
 getline(filestr, s);

 

3 quando faço:

 

fstream filestr ("mostra.txt", fstream::out|fstream::in);

 

Que nome se dá ao termo filestr na linha acima? canal de fluxo? quando o programador define este nome o que ele está dizendo?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

2- Por que o arquivo não está sendo criado? Qual o erro?

 

fstream filestr ("mostra.txt", fstream::out|fstream::in);

 

filestr << "i/o operations here";

string s;

filestr.seekg(0);// Posiciona arquivo no início

getline(filestr, s);

 

Aparentemente, está tudo correto. Tente utilizar flags de modo de abertura diferentes dos que você usa.

Verifique se o objeto filestr não está retornado erro, utilize o método is_open. Como fiz naquele código que postei.

 

Não sei se você não copiou no post, mas fechou o arquivo após utilizá-lo?

 

 

3 quando faço:

 

fstream filestr ("mostra.txt", fstream::out|fstream::in);

 

 

 

Que nome se dá ao termo filestr na linha acima? canal de fluxo? quando o programador define este nome o que ele está dizendo?

 

Sim,é um stream. É como um cin e cout, só que direcionado ao arquivo para o qual foi associado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

2- Eu não entendi a utilização de

 

if(!fHandle.is_open())
       // Arquivo não foi aberto, retorna erro
       return -1;

 

poderia explicar seu funcionameno ? onde se encontra esta macro? não vi isso no livro do DEITEL.

 

Eu fiz o seguinte teste:

 

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main () {

 fstream filestr ("mostra.txt", fstream::out|fstream::in);
 if(!fHandle.is_open())
       // Arquivo não foi aberto, retorna erro
       return -1;


 filestr << "i/o operations here";
 string s;
 filestr.seekg(0);// Posiciona arquivo no início
 getline(filestr, s);
 cout <<"Lido o arquivo: "<< endl << s << endl << endl;

 filestr.close();

 return 0;
}

Erro

 

Teste.cpp:13:7: error: 'fHandle' was not declared in this scope

 

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

2- Eu não entendi a utilização de

 

if(!fHandle.is_open())

// Arquivo não foi aberto, retorna erro

return -1;

 

 

 

poderia explicar seu funcionameno ? onde se encontra esta macro? não vi isso no livro do DEITEL.

 

 

is_open() é um método da classe ifstream que retorna se o arquivo foi aberto com sucesso ou não. Não é uma macro.

 

Segue a explicação do método:

http://www.cplusplus.com/reference/iostream/ifstream/is_open/

 

 

Eu fiz o seguinte teste:

 

Erro

 

Quote

Teste.cpp:13:7: error: 'fHandle' was not declared in this scope

 

 

fHandle é um objeto da classe fstream que declarei, você deve substituí-lo pelo objeto que você declarou, no caso filestr.

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

 

Veja o programa abaixo alterado, não tem mais erro de compilação, entretanto está ocorrendo a seguinte situação:

 

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;


int main () {

 fstream filestr ("mostra.txt", fstream::out|fstream::in);
 if(!filestr.is_open())
       // Arquivo não foi aberto, retorna erro
       return -1;


 filestr >> "i/o operations here";
 string s;
 filestr.seekg(0);// Posiciona arquivo no início
 getline(filestr, s);
 cout <<"Lido o arquivo: "<< endl << s << endl << endl;

 filestr.close();

 return 0;
}

 

1-O arquivo “mostra.txt” não está sendo gerado

2-A linha:

 

if(!filestr.is_open())

 

não está emitindo nenhuma mensagem de erro em tela.

A idéia é demonstrar que a linha:

 

fstream filestr ("mostra.txt", fstream::out|fstream::in)

 

funxiona. Que fazer?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Tem certeza que esse código que você postou compilou?

Tentei compilar aqui e acusou erro nesta linha:

filestr >> "i/o operations here";

 

Bom, vou tentar te explicar. Quando criamos um objeto fstream estamos criando uma stream, ou seja, um fluxo de comunicação. Um objeto fstream, é um objeto igual aos objetos cin e cout.

A diferença é que cin está associado normalmente ao teclado, cout está associado normalmente a tela e o objeto fstream vai estar associado ao arquivo que recebeu como parâmetro.

 

Você não fazer aquela linha acima, pois está tentando ler o conteúdo do arquivo para uma const string.

Se a sua intenção era gravar no arquivo, deve utilizar o operador <<.

 

fstream filestr ("mostra.txt", fstream::out|fstream::in);

 

Não pode abrir um arquivo para leitura e escrita ao mesmo tempo. Criei este arquivo apenas como escrita e funcionou corretamente.

 

2-A linha:

 

if(!filestr.is_open())

 

não está emitindo nenhuma mensagem de erro em tela.

 

Aqui quando executei caiu no if e saiu do programa, graças ao return -1.

Se queres ver alguma coisa, substitua o return -1 por alguma mensagem sua.

 

Segue o código corrigido compilando:

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;


int main () {

 fstream filestr ("mostra.txt", fstream::out);
 if(!filestr.is_open())
       // Arquivo não foi aberto, retorna erro
       return -1;


 filestr << "i/o operations here";
 string s;
 filestr.seekg(0);// Posiciona arquivo no início
 getline(filestr, s);
 cout <<"Lido o arquivo: "<< endl << s << endl << endl;

 filestr.close();

 return 0;
}

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

:thumbsup:

 

Agora eu entendi:

 

Eu tinha lido que fstream podia ser usado tanto para leitura como gravação, só que NÃO pode ser usado simultaneamente; eu achava que podia, ai o erro.

 

4- O operador de fluxo >> pode ser usado para leitura de arquivo ? pergunto isso por que << é usado para gravar.

 

5- Usei cerr no lugar de is_open() faz o mesmo papel de verificação?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

4- O operador de fluxo >> pode ser usado para leitura de arquivo ? pergunto isso por que << é usado para gravar.

 

Pode sim. Este operador é sobrecarregado para ser utilizado em vários objetos de stream. Como o cin e objetos fstream. o operator<<, também é sobrecarregado.

 

5- Usei cerr no lugar de is_open() faz o mesmo papel de verificação?

 

Pelo que entendi, cerr é utilizado para retorno de erros do sistema. E que por default está associado ao console do SO. Tanto faz se for Windows um UNIX.

Ainda não utilizei este objeto, mas vi que existe também o clog que nunca utilzei.

 

Mais informações sobre o cerr:

http://www.cplusplus.com/reference/iostream/cerr/

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

:upset:

 

Veja o código.

 

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


int main () {

 fstream grava ("arquivo.txt", fstream::out);
  cria << "ALGO";
 cria.close();

 fstream le ("arquivo.txt", fstream::in);
// Codigo com >>
// le >>......  
 le.close();

 return 0;
}

 

A parte que grava o texto “ALGO” funciona, mas a parte que lê o arquivo não, e por isso não deixa o programa compilar. Como usar >> para ler arquivo com operador >> ?

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Peixoto,

 

Utilize uma string:

 

...
char strTextoLido[200];
...
...
le >> (char*)strTextoLido;
...
...

 

Assim vai colocar a string lida do arquivo direto na string declarada.

 

Segue explicação do operator>>.

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

3 Os arquivos de C++ tem alguns verificadores de status para informar a condição do arquivo, a maioria retorna erro. Embora tenha a descrição de alguns, poderia dar alguns exemplos (dois ou três da lista) de como se usa esses verificadores?

 

bad

clear

fail

gcount

good

rdstate

 

clear limpqa o que ?

fail informa o que?

gcount conta o que?

good retorna o que?

 

por exemplo. poderia ilustrar com programa simples?

 

Obrigado

 

:mellow:

 

Reformulando a pergunta

 

3 temos verificadores de statu de arquivo

 

Ex:

good Retorna verdadeiro se a operação de E/S é bem-sucedida

 

 

Sei que gcount retornará o número de caracteres que a última operação de entrada binária leu. Existe função equivalente para arquivo texto ?

 

4- Para ler o conteúdo de arquivo com >> tentei fazer:

 

fstream le ("Arquivo.txt", fstream::in);
 string s;
 le >> s;
 cout << "Lido o arquivo: "<< endl << s << endl << endl;

 

Para ler o conteúdo do arquivo “Arquivo.txt”. No arquivo está gravado o texto:”ALGO NO ARQUIVO”, entretanto na tela só está sendo mostrado parte inicial do texto, ou seja a palavra “ALGO” por quê?

 

Tentei fazer

 

while (!le.eof())
 {
 le >> s;
 cout << s;
 }

 

Para minha surpresa o texto mostrado em tela foi:

ALGONOARQUIVO

 

Eu achava que ao fazer:

 

  le >> s;

 

estaria jogando toda a constante do arquivo para s, inclusive com os espaços. Como corrigir isso?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.