View Full Version : Trabalho de programação em c++ com ficheiros


The_Kenobi
25-01-2008, 23:20
Boas people este é o meu 1º post aki:P
Vi este topiko aki e resolvi expor a minha duvida:D

tenho de fazer um programa em c++ k grave em ficheiro .dat o nº de processo, nome, numero, turma e ano!
Mas depois podelos eliminar e alterar!!!;)
Ai é k está o meu problema!prá já ele grava-me esses dados mas agora presisava de ajuda no alterar e eliminar:P

aki fika o k tenho ate agora:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
typedef struct
{

int n_processo,ano;
char nome[20], turma[20];
}
tnomes;
FILE *f, *auxf;

void abrir_fich()
{
if((f=fopen("dados.dat","r+"))==NULL)
{
printf("O ficheiro nao existe! Foi criado um novo\n");
f= fopen ("dados.dat","w+");
}
else printf("Ficheiro aberto com sucesso! \n");
}
void ler_dados(tnomes *r)
{
printf("Insira o numero de processo do aluno \n");
scanf("%d",&r->n_processo);
printf("Insira o nome do aluno \n");
scanf("%s",r->nome);
printf("Insira a Turma do Aluno \n");
scanf("%s",r->turma);
printf("Insira o ano do aluno \n");
scanf("%d",&r->ano);

}
void escrever_dados(tnomes *r)
{
printf("Numero de processo do aluno: %d\n",r->n_processo);
printf("Nome do Aluno: %s\n",r->nome);
printf("Turma do aluno: %s\n",r->turma);
printf("Ano do aluno: %d\n",r->ano);

}
int ler_fich(tnomes regs[])
{
int i=0;
fread(&regs[i],sizeof(tnomes),1,f);
while(!feof(f))
{
i++;
fread(&regs[i],sizeof(tnomes),1,f);
}
return(i);
}
void escrever_fich(tnomes regs[], int n)
{
int i;
for(i=0;i<n;i++)
fwrite(&regs[i],sizeof(tnomes),1,f);
}
int menu()
{
system("color 4E");
int op;
printf("\t\t***************[MENU]***************\n");
printf("\n\t\t\t\ 1-Inserir\n");
printf("\n\t\t\t\ 2-Consultar\n");
printf("\n\t\t\t\ 3-Alterar \n");
printf("\n\t\t\t\ 4-Remover registo \n");
printf("\n\t\t\t\ 5-Ordenar registos \n");
printf("\n\t\t\t\ 6- Sair\n");
printf("\n>QUAL A SUA OPCAO: \n");
scanf("%d",&op);
return(op);

}
main()
{
int opc,i,dim=0;
tnomes registos [100];
abrir_fich();
dim=ler_fich(registos);
do
{
opc=menu();
switch(opc)
{
case 1:
ler_dados(&registos[dim]);
dim++;
break;

case 2:
for(i=0;i<dim;i++)
escrever_dados(&registos[i]);
break;
}
}while(opc!=6);
escrever_fich(registos,dim);
} Alguem me pode dar uma ajuda:P?

AragTey
25-01-2008, 23:54
para eliminar o mais fácil é carregares tudo em memória, apagas ai e depois escreves um novo ficheiro.

mj2p
26-01-2008, 00:58
Para o teu caso, eu utilizaria listas ligadas para gerir a informação. No inicio do programa gravava tudo para a memória e depois fazia as gestões necessárias.

Vá, cumps

The_Kenobi
26-01-2008, 10:42
e como faço isso?:S
eu sou uma nodoa em programação...:P

AragTey
26-01-2008, 11:09
Eu faria com vectores (no fundo sãp quase como uma lista duplamente ligada).


typedef struct
{

int n_processo,ano;
char nome[20], turma[20];
}
tnomes;

// declaracao do vector do tipo tnomes
vector<tnomes> list_tnomes;

// uma pequena alteracao na leitura, aconselho-te a escrever logo no inicio do ficheiro
// a quantidade de elementos tnomes que vais ler. Assim com um for fazes mais facilmente
// a leitura
int ler_fich(tnomes regs[])
{
int i=0;
tnomes aux_tnomes;
fread(&aux_tnomes,sizeof(tnomes),1,f);
list_tnomes.push_back(aux_nomes);
while(!feof(f))
{
i++;
fread(&aux_tnomes,sizeof(tnomes),1,f);
list_tnomes.push_back(aux_nomes);
}
return(i);
}

// apagar um elemento do vector
void del_tnomes()
{
// percorrer todo o vector com 1 iterador
for (vector<tnomes>::conts_iterator it = list_tnomes.begin() ; it != list_tnomes.end() ;
it ++)
if (it->n_processo == 1000) // exemplo de comparacao para identificar elemente a apagar)
list_tnomes.erase(it);
// atencao se achares que vais apagar mais de 1 elemento convem percoreres o vector de fim para o inicio
}

// depois percorrer novamente o vector e escreves para o ficheiro.


Procura por info no google sobre vectores:

http://www.cplusplus.com/reference/stl/vector/

MadOnion
26-01-2008, 15:04
para eliminar o mais fácil é carregares tudo em memória, apagas ai e depois escreves um novo ficheiro.

Por vezes, esse tipo de metodologia não é boa ideia. Imagina que o ficheiro tem 1Gb?
Trás algumas consequências depois(já não falo em swap out ou memória virtual).

AragTey
26-01-2008, 15:26
Por vezes, esse tipo de metodologia não é boa ideia. Imagina que o ficheiro tem 1Gb?
Trás algumas consequências depois(já não falo em swap out ou memória virtual).

Exato, por isso referi que era o mais fácil ;), neste altura se ele ainda está no inicio não convém complicar a coisa, com manuseamento de ponteiros em ficheiros.

m00s
26-01-2008, 23:26
isto é mais C do que C++, não!?

sir_atmc
28-01-2008, 18:11
isto é mais C do que C++, não!?

Não. É C++. Não te esqueças que C++ deriva do C :P

arconada
31-01-2008, 14:11
isto é mais C do que C++, não!?

se eles o dizem.... eu sinceramente nao vi nada no codigo mostrasse ser C++... nem usa classes... mas... posso ser eu que não percebo muito disso

AragTey
31-01-2008, 15:32
se eles o dizem.... eu sinceramente nao vi nada no codigo mostrasse ser C++... nem usa classes... mas... posso ser eu que não percebo muito disso

Por exemplo a parte dos vectores é de C++. Neste caso o código é uma mistura....já que a parte de manuseamento de ficheiro está em C. Poderia ser feita com ifstream e ofstream dando um aspecto mais "C++" á coisa.

Mas também posso ser parcial, porque neste momento a minha mente já está corrupta e já não consigo pensar apenas em C ou apenas em C++.

m00s
31-01-2008, 15:56
eu acredito mais nessa ultima possibilidade ("mente corrupta")! :D

mas tudo bem... nao faço questão de teimar com ninguém mas no meu ponto de vista é C e nao outra coisa.

...adiante!

AragTey
31-01-2008, 16:01
eu acredito mais nessa ultima possibilidade ("mente corrupta")! :D


;), pelo menos fui confirmar e vector é de C++.....já não tá mal :D....mas pronto sou mesmo um corrompido.

sir_atmc
31-01-2008, 18:43
isto é mais C do que C++, não!?

Não. É C++. Não te esqueças que C++ deriva do C :P

se eles o dizem.... eu sinceramente nao vi nada no codigo mostrasse ser C++... nem usa classes... mas... posso ser eu que não percebo muito disso

De facto é verdade. Quando eu disse que era mesmo C++ foi porque nem tinha lido o post inicial, só tinha visto a ideia do mj2p bem como dos ponteiros (que são usuais em C, penso eu, mas em C++ também se usa bastante). Mas agora que vi o post inicial também não vi grande coisa de C++.

No entanto, conheço pessoas que programam em C++ com uma mistura com C (redundancia, C++ deriva do C). O que fazem é usar cada uma das linguagens na situação que mais lhes convém.

AragTey
31-01-2008, 20:27
No entanto, conheço pessoas que programam em C++ com uma mistura com C (redundancia, C++ deriva do C). O que fazem é usar cada uma das linguagens na situação que mais lhes convém.

Sou um desses....o que ainda não consegui perceber é se isso é bom ou mau?? enfim...desde que o boss não refile :D

walterwolf
01-02-2008, 01:55
isso nao é C++ mas sim C, sekalhar poderá funcionar mun ficheiro .cpp, mas definitivamente nao é codigo c++.