Jump to content
Carllone

Funçao carrega ficheiro

Recommended Posts

Carllone

Boa Tarde,

Sou novo cá no forum e precisava de ajuda numa função que estou a desenvolver que ao abrir o programa, abre o ficheiro (se existir) e carrega todas as estruturas contidas nele para a memória.

o Código é o seguinte:

jogador *leficheiro(int *tam){

jogador *j;
FILE *f;


*tam=1;

f=fopen("Jogadores.bat", "rb");		// abre ficheiro e testa
if(f==NULL)
	return(NULL);

j=(jogador *) malloc(sizeof(jogador));  //aloca memoria dinamica e testa

if(j==NULL)
	return(NULL);


while(fread(&j, sizeof(jogador), 1, f) == 1){      // le as estruturas do ficheiro 
	*tam=*tam+1;
	j=(jogador *)realloc(j, (*tam)*sizeof(jogador));
	if(j==NULL)
		return(NULL);
	fscanf(f, "%d", &j[*tam-1].idade);
	fgets(j[*tam-1].nome,80,f);
	fscanf(f,"\n%d\n", &j[*tam-1].n_jogos);
	fscanf(f, "%d", &j[*tam-1].score);
}

fclose(f);
return j;
}

e dá me este erro:

semttuloie.png

Toda a ajuda é bem vinda!

Share this post


Link to post
Share on other sites
brunoais

escreve aí nesse código uns (possivelmente um a cada comando):

printf("camehere1\n");

em que a cada um q escreves incrementas o número depois de here.


"[Os jovens da actual geração]não lêem porque não envolve um telecomando que dê para mirar e atirar, não falam porque a trapalhice é rainha e o calão é rei" autor: thoga31

Life is a genetically transmitted disease, induced by sex, with death rate of 100%.

Share this post


Link to post
Share on other sites
bubulindo

Importas-te de colocar o código onde esta funcão é chamada? Como o tam vem de fora, pode acontecer que estejas a colocar o apontado por em vez do endereco de memória.

Assim de repente é a única coisa que me vem à ideia com um erro desses... apesar de achar estranho isto "*tam=1" não ter dado erro nesse caso.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Carllone

a fução que chama é:

int main(){

int op=0, t=0;

jogador *j;

int N;

j=leficheiro(&N);

if(j==NULL)

              break;

Share this post


Link to post
Share on other sites
bubulindo

Não faco mesmo ideia... :\

Já experimentaste criar um apontador e passar esse apontador em vez do endereco da variável? É estúpido, eu sei, mas pode dar alguma pista relativamente ao problema.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Xpirito

Access violation acontece quando estás a "querer" usar memória que não é do teu programa ou estás a querer escrever na memória sem que ela esteja reservada para ti. Acontece muito quando se trabalha com ponteiros.

Pode acontecer também quando estás a trabalhar com vectores e apontas para fora do vector.

Vendo o teu código, para mim está complicado de o entender, mas revê isso e repara bem se não estás a escrever na memória antes de a alocares ou algo assim.


Para perguntas idiotas, respostas estúpidas!

Share this post


Link to post
Share on other sites
KTachyon

O "camehere6" é imprimido quantas vezes?


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
KTachyon

Manda imprimir o endereço da variável e compara com o endereço que te é dado no access violation.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
blackburn69

Boa noite.

Tens um erro no código aqui:

while(fread(&j, sizeof(jogador), 1, f) == 1){

Não é &j mas sim j, visto tratar-se de um apontador para uma estrutura (e não realmente uma estrutura). Ao passares &j, está a passar o endereço de memória que contém o endereço da estrutura, que tem tamanho 4 bytes e não o sizeof() da estrutura jogador. Ao passares j, estás a passar o endereço da estrutura que já tem alocado o espaço necessário.

Espero ter sido esclarecedor.

Share this post


Link to post
Share on other sites
bubulindo

Experimenta meter o código da funcão dentro da main e define na mesma um apontador para N.

Vê se o mesmo acontece...

No entanto, define o valor de N.

N=0


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
Carllone

Eu criei outro projecto  e copiei tudo, depois criei uma função carrega_memoria e copiei o codigo , e no sitio onde estava chamei a funçao.

Compilei e por enquanto está tudo a funcionar....

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

×
×
  • 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.