Jump to content
Sign in to follow this  
pedroC

Problemas a ler de ficheiro

Recommended Posts

pedroC

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;

}


Share this post


Link to post
Share on other sites
TheDark

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:


Desaparecido.

Share this post


Link to post
Share on other sites
pedroC

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)

Share this post


Link to post
Share on other sites
TheDark

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.


Desaparecido.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.