• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedroC

Problemas a ler de ficheiro

4 mensagens neste tópico

Boas, Estou a ter problemas num pequeno codigo. O ficheiro deveria guardar os dados, permitir modificaçoes e eliminação de dados. O que se passa é que quando corro o programa ele diz que os dados ja estão inseridos, quando na realidade não estão. Estou a partir a cabeça com isto ja a algum tempo :wallbash:. Sempre que tento vizualizar os dados ele mostra  valores desconhecido(pelo menos para mim).

Desde ja agradeço a ajuda, os meus melhores cumprimentos

#include <iostream>
#include <iomanip>
#include <fstream>
#include <stdlib.h>
#include <string>

using namespace std;

struct estruturaAluno
{
  char numeroAluno[5];
  char nomeAluno[81];
};

int MenuEscolhaAluno();
void AdicionaAluno(fstream&);
void ApagaAluno(fstream&);
void ModificaAluno(fstream&);
int Menu_ModificarAluno();
void MostraAlunos(fstream&);
int ValidaNumeroAluno(long);

int main()
{
  int choice;
  int quit = 0;

  cout << setprecision(2)
	 << setiosflags(ios::fixed)
       << setiosflags(ios::showpoint);

  fstream part_file;

  estruturaAluno null_part = {" "," "};


  part_file.open("partfile.dat", ios::in | ios::binary);
  if (part_file.fail())
 {
	 cerr << "Ficheiro Nao existe."<<endl;
	 cerr << "Insira dados para criar o ficheiro binario partfile.dat. "<<endl;
	 part_file.close();
	 exit(1);
  }
  part_file.close();



  part_file.open("partfile.dat", ios::in | ios::out | ios::binary);

  // loop

  do
 {
	choice = MenuEscolhaAluno();
	switch (choice)
	  {
		 case 1:
			AdicionaAluno(part_file); break;
		 case 2:
			ApagaAluno(part_file); break;
		 case 3:
			ModificaAluno(part_file); break;
		 case 4:
			MostraAlunos(part_file); break;
		 case 5:
			quit = 1; break;
		 default:
			cout << "\n\nEscola Invalida. Tente novamente.\n\n"; break;
	  }
 }
  while (!quit);

  part_file.close();

  cout << endl;
  return 0;
} 

int MenuEscolhaAluno()
{
  int choice;

  cout << "\n\nMenu Principal : ALUNO";
  cout << "\n\n1 - Adiciona Aluno"
	 << "\n2 - Apaga Aluno"
	 << "\n3 - Modifica Aluno"
	 << "\n4 - Mostra alunos inseridos"
	 << "\n5 - Sai do Menu";

  cout << "\n\nEscolha uma Opcao: ";
  cin >> choice;

  return choice;
}  

void AdicionaAluno(fstream& file)
{
  estruturaAluno part;
  estruturaAluno temp_part;

  char rec_num;

  cin.get();

  cout << "\nInsira o numero de Aluno:";
  cin.getline(part.numeroAluno, 5);

  rec_num = (part.numeroAluno,5);
  if ( !ValidaNumeroAluno(rec_num) )
 return;

  cout << "\nInsira o Nome do Aluno: ";
  cin.getline(part.nomeAluno, 81);
  fflush();


  file.seekg( (rec_num - 1) * sizeof(estruturaAluno), ios::beg);

  file.read( (char *)&temp_part, sizeof(estruturaAluno) );

  if ( strcmp(temp_part.numeroAluno, " ") == 0)
 {
	file.seekg( -(long)sizeof(estruturaAluno), ios::cur);
	file.write( (char *)∂, sizeof(estruturaAluno) );
	cout << "\nRecord " << part.numeroAluno << " added to file.";
 }
  else
 cout << "\nJa existe. Escolha outro numero.";
}

void ApagaAluno(fstream& file)
{
  estruturaAluno part;
  estruturaAluno null_part = {" "," "};

  long rec_num;

  cout << "\nInsira o numero de Aluno que pretende Apagar: ";
  cin >> rec_num;

  if (!ValidaNumeroAluno(rec_num))
 return;

  file.seekg( (rec_num - 1) * sizeof(estruturaAluno), ios::beg);
  file.read( (char *) ∂, sizeof(estruturaAluno) );

  if ( strcmp(part.numeroAluno, "") == 0)
 cout << "\nA opcao nao existe escola outra opcao.";
  else
 {
	file.seekg(-(long)sizeof(estruturaAluno), ios::cur);
	file.write( (char *) &null_part, sizeof(estruturaAluno) );
	cout << "\nAluno numero " << rec_num << " apagado com exito do ficheiro.";
 }

}

void ModificaAluno(fstream& file)
{
  estruturaAluno part;
  long rec_num;
  int change;
  int quit = 0;

  cout << "\ninsira o numero de Aluno que pretende modificar: ";
  cin >> rec_num;

  if (!ValidaNumeroAluno(rec_num))
 return;

  file.seekg( (rec_num - 1) * sizeof(estruturaAluno), ios::beg);
  file.read( (char *) ∂, sizeof(estruturaAluno) );

  if ( strcmp(part.numeroAluno, "") == 0)
 {
	cout << "\nO aluno nao existe. Tente outro numero.";
	return;
 }

  cout << "\nEscola os dados que pretende modificar:\n\n";
  cout << setw(20) << "Numero de Aluno"
	 << setw(20) << "Nome de Aluno"<< endl << endl;
  cout << setw(20) << part.numeroAluno
	 << setw(20) << part.nomeAluno;


  do
 {
	change = Menu_ModificarAluno();
	switch (change)
	  {
		 case 1:
			cout << "\nNome de Aluno: ";
			cin >> part.nomeAluno;
			break;
		 case 2:
			quit = 1;
			file.seekg(-(long)sizeof(estruturaAluno), ios::cur);
			file.write( (char *) ∂, sizeof(estruturaAluno) );
			cout << "\nMudanca executada " << rec_num;
			break;
		 default:
			cout << "\nEscolha invalida. Insira nova escolha.";
			break;
	  }
 }
  while (!quit);

} 

int Menu_ModificarAluno()
{
  int change;

  cout << "\n\nMenu Modificar Aluno\n\n";
  cout << "1 - Modifica Nome\n"
	 << "2 - Modificar Numero\n"
	 << "3 - Executa as mudancas e volta ao menu principal\n\n";
  cout << "Insira uma opcao: ";
  cin >> change;

  return change;
} 

void MostraAlunos(fstream& file)
{
  estruturaAluno part;
  long rec_num;
  long rec_count = 0L;
  fflush();

  file.seekg( 0L, ios::beg);

  cout << setw(20) << "\nNome"
	 << setw(20) << "Numero"<< endl << endl;

  for (rec_num = 1L; rec_num <= 99L; ++rec_num)
 {
	file.read( (char*) ∂, sizeof(estruturaAluno) );
	if (strcmp(part.numeroAluno, "") != 0)
	  {
          cout << setw(20) << part.numeroAluno
				<< setw(20) << part.nomeAluno<< endl;
		 ++rec_count;
	  }
 }

  cout << "\n\nFile contains " << rec_count << " records.";

}

int ValidaNumeroAluno(long rec_num)
{
  if ( rec_num < 00000 || rec_num > 99999 )
 {
	cout << "\n\nERRO: Numero invalido. Insira outra opcao.";
	return 0;
 }
  else
 return 1;

}


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fflush sem parâmetros...? Estás a conseguir compilar o código que colocaste aí?

O que é suposto estares a fazer nesta linha:

  rec_num = (part.numeroAluno,5);

? É que o que isso faz é colocar na variável rec_num o valor 5, sempre.

Não olhei para o código adiante, quando responderes continuamos :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o objectivo é guardar o numero de aluno com uma dimensão até 9999.Assim quero garanir que o valor tem sempre essa dimensão maxima.

Pois, em relação ao fflush queria usar para limpar o buffer, uma vez que tenho um problema com os ficheiros onde guardo a informação.

Este programa está a funcionar relativamente mal, uma vez que não guarda os dados. (aparece informação vinda de não sei onde..muito estranha)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas em que te baseaste para escrever essa linha? É que escreveres aquilo ou rec_num = 5; dá exactamente o mesmo resultado. Como podes ver aqui, o que está à esquerda da vírgula é ignorado, e é atribuído o valor que está à direita da vírgula. Para fazeres o que queres, uma hipótese será utilizar

rec_num = (part.numeroAluno > 9999 ? 5 ; 9999 );

Se não conheceres o operador ternário, podes ver mais aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora