Peixoto 0 Denunciar post Postado Agosto 13, 2012 :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 10E der: ^z Dá certo Mas se eu fizer: Carlos Alberto 10E 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
GBecker 51 Denunciar post Postado Agosto 14, 2012 Peixoto, Tente utilizar os métodos get ou getline. Compartilhar este post Link para o post Compartilhar em outros sites
Peixoto 0 Denunciar post Postado Agosto 14, 2012 :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
GBecker 51 Denunciar post Postado Agosto 17, 2012 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
Peixoto 0 Denunciar post Postado Agosto 18, 2012 :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
GBecker 51 Denunciar post Postado Agosto 18, 2012 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
Peixoto 0 Denunciar post Postado Agosto 19, 2012 :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
GBecker 51 Denunciar post Postado Agosto 19, 2012 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
Peixoto 0 Denunciar post Postado Agosto 19, 2012 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
GBecker 51 Denunciar post Postado Agosto 19, 2012 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
Peixoto 0 Denunciar post Postado Agosto 20, 2012 :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
GBecker 51 Denunciar post Postado Agosto 20, 2012 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
Peixoto 0 Denunciar post Postado Agosto 20, 2012 :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
GBecker 51 Denunciar post Postado Agosto 21, 2012 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
Peixoto 0 Denunciar post Postado Agosto 23, 2012 :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
GBecker 51 Denunciar post Postado Agosto 23, 2012 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
Peixoto 0 Denunciar post Postado Agosto 27, 2012 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