Ir para conteúdo

POWERED BY:

Arquivado

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

WelberSimoes

Não consigo encontrar o erro. (Programa para criar e ler recados)

Recommended Posts

Boa noite, pessoal

 

Sou novo como membro no fórum, mas já consulto os materiais daqui ha um bom tempo.

 

 

Estou precisando de uma grande ajuda. Comecei a estudar C++ nas aulas de Computação esse semestre na universidade e estou gostando bastante, mas comecei a escrever um programa para anotar recados (esse funcionou bem) e outro para ler os recados gravados em arquivos de texto. Ainda não tive aulas para trabalhar com alguns recursos que eu estou usando (faltam uns 5 capítulos no livro para chegarmos lá) e eu preciso entender melhor isso.

 

O que eu tenho encontrado problema é:

- Como declaro uma string "char b[100]" como vetor. Para ter mais que uma string ?

- Não é necessário declarar as variáveis mês e dia como vetor, certo ? Porque elas estão dentro do laço e quando ele rodar novamente, as variáveis recebem novo valor.

 

Quando o programa rodou, ele só lia o primeiro recado. Depois disso eu mudei e mudei (e não salvei a versão anterior) e agora nem o primeiro ele lê mais !

 

em amarelo estão algumas anotações minhas.

 

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

using namespace std;

int main(int argc, char *argv[])
{
   int op, dia[100], mes[100], nop, telefone[100];
   char recado[100], cli[10];
   char a;

   ifstream leitura;
   leitura.open("recados.txt");
//
// Função padrão que verifica se o arquivo está aberto. Se não estiver, ela encerra o programa.
//
   if(!leitura.is_open( ))
   {
                	cout<< "Não foi possível abrir arquivo! Programa será terminado!\n";
                	leitura.clear( ); //reseta o objeto leitura, para limpar memória do sistema
                	return 0;
   }
   else
   {
       cout << "Acesso ao banco de dados : SUCESSO !\n\n";
   }
   cout << "======= MENU =======\n\n";
   cout << "1 - Recados do dia\n2 - Recados do mes\n\n";
   cout << "Opcao desejada :  "; cin >> op;

[color="#FFFF00"]// Usei o comando swtich também. Na verdade, já havia estruturado no papel escrever com ele, mas tentei mudar para ver
// se eu tinha errado em algo nele.[/color]
   if(op == 1)
   {

                           cout << "Hoje e dia : "; cin >> nop;
// A ideia de usar um for aqui é para ler vários recados
                           for(int i=1; i < 100; i++)
                           {
                                	leitura.getline(cli,10);
                                	leitura >> dia[i];
                                	leitura >> mes[i];
                                	leitura >> telefone[i];
                                	leitura.getline(recado,100);
                                	if(nop == dia[i])
                                	{
                                           cout << "\n\n";
                                           cout << cli[10] << endl;
                                           cout << dia[i] << endl;
                                           cout << mes[i] << endl;
                                           cout << telefone[i] << endl;
                                           cout << recado[100] << endl;
                                	}
                           }


   }
   system("PAUSE");
   return EXIT_SUCCESS;
}

 

Essa é a estrutura do arquivo .txt: (sem meus comentários//

)

 

Teste // cliente

10 // dia

12 // mês

24387569 // telefone

Teste de recado // recado

 

 

Desde já agradeço e parabenizo à todos os que utilizam o fórum com assiduidade e contribuem para ele crescer, pois vocês são feras demais !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como vetor você pode declarar de duas formas:

 

char vstrings [][100]

 

ou

 

char ** vstrings (Ponteiro p/ ponteiro. Utilizada em alocação dinâmica)

 

Mas acho que é bom se acostumar também com a STL. Você pode usar os containers vector ou array:

 

#include <array>

array <string, 10> vstring;

 

#include <vector>

vector <string> vstring = new vector(10);

 

(Quando se usa o new p/ alocar memória, use o delete p/ liberá-la, tal como malloc/realloc/free).

 

Vou tentar rodar o programa aqui na máquina virtual.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei um pouco o programa:

 

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[]) {
const int SizeCliente = 100;
const int SizeTelefone = 100;
const int SizeRecado = 100;
const int SizeDia = 100;
const int SizeMes = 100;

int op, dia[sizeDia], mes[sizeMes], nop;
char telefone[sizeTelefone][10];
char recado[sizeRecado][100];
char cli[sizeCliente][20];

ifstream leitura;
leitura.open("p14.txt");

if(!leitura.good()) {
 	cout<< "Não foi possível abrir arquivo! Programa será terminado!\n";
 	leitura.clear(); //reseta o objeto leitura, para limpar memória do sistema
 	return 1;
}

cout << "======= MENU =======\n\n";
cout << "1 - Recados do dia\n2 - Recados do mês\n\n";
cout << "Opção desejada :  ";
cin >> op;

if (op == 1) {
     	cout << "Hoje é dia: ";
     	cin >> nop;
     	int i = 0;
     	do {
       	leitura.getline(cli[i], 20);
       	if (leitura.eof()) break;

       	leitura >> dia[i];
       	leitura.get();
       	leitura >> mes[i];
       	leitura.get();
       	leitura.getline(telefone[i],10);
       	leitura.getline(recado[i],100);
       	if(nop == dia[i]) {
         	cout << "\n\n";
         	cout << cli[i] << endl;
         	cout << dia[i] << endl;
         	cout << mes[i] << endl;
         	cout << telefone[i] << endl;
         	cout << recado[i] << endl;
       	}
       	i++;
     	} while (!leitura.eof());                                                                                    	
}
leitura.close();
return 0;
}

 

O arquivo precisa ser contínuo, sem linhas em branco. Os leitura.get() são necessários porque ao usar a sobrecarga do >> no ifstream, o \n fica no final da entrada (povo que conhece mais c++, me corrija se necessário). Se você colocar uma linha separando os registros no arquivo, então precisa de outro leitura.get() associado a um continue dentro do while.

Compartilhar este post


Link para o post
Compartilhar em outros sites

"do{

.

.

.

} while (!leitura.eof()); "

 

Nossa, adorei a lógica. Eu tinha tentado escrever com while, do while, mas não conhecia o comando "eof". Muito interessante.

 

 

Mas, não está rodando aqui. Aparece uma mensagem : "***[isis.o]Error1".

 

Não sei o que significa, mas não consigo compilar o algoritmo.

 

 

 

Vou procurar encontrar o que está acontecendo e rodar novamente.

Ah, muito obrigado por explicar a questão da declaração das strings. Achei muito bacana.

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.