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

martinhocosta

Guardar dados na struct

Recommended Posts

martinhocosta

gostaria de saber porque é que este codigo nao guarda dados na struct????? 🤔

#include<stdio.h>

#include<stdlib.h>

struct dados{

int ano[32];

int semestre[32];

char curso[50][92];

char unidadeCurricular[50][92];

int t[32],tp[32],pl[32],tc[32],s[32],ot[32],e[32];

}d;

void funcao()

{

    int i;

    FILE *op;

    op=fopen ("dados_ucs_070410.txt", "r");

    if (op==NULL)

    {

                  printf("\n\n\n\t\tO ficheiro nao foi aberto");

    }

    else

    {

        for (i=0;i<92;i++)

        {

            fscanf(op, "\n%s",& d.curso);

            printf("%s", d.curso);

        }

        fclose(op);

    }

}

int main()

{

    funcao();

    system("pause");

}

Share this post


Link to post
Share on other sites
Localhost

Tens uma matriz de strings. Estás a fazer um loop, ou seja, tens de indexar uma string para puderes guardar lá.

fscanf(op, "%s",&d.curso[i]);
printf("%s", d.curso[i]);


here since 2009

Share this post


Link to post
Share on other sites
Localhost

Tens dentro da struct que definiste um campo *char curso[50][92]*, ou seja, uma matriz com 50 strings que podem comportar 92 caracteres. Depois, pelo que vejo, tu queres ler para essas strings todas. Então fazes um loop (que por acaso está mal feito, *i* devia de incrementar até 50 e não 92) e depois utilizas a função *fscanf* para ler para cada uma dessas strings. No entanto, não estás a indexar, ou seja, o loop não está a servir para nada. Tens de indexar essa matriz para leres para a string que estás a percorrer no momento.

edit: @Strabush, isso está errado.

edit2: Por favor, volta a postar porque parece que fiquei a falar sozinho.


here since 2009

Share this post


Link to post
Share on other sites
Strabush

:thumbsup:

Como era uma matriz, deduzi que os valores a serem inseridos nela deviam ser da forma:

d.curso[i][i]

E ao fazeres o scanf usas "d.curso" apenas.

Share this post


Link to post
Share on other sites
Localhost

Isso está errado porque assim estás a aceder à i-ésima string e ao seu i-ésimo caracter. Neste caso não resultaria num buffer overflow porque o número strings é menor do que o número de caracteres que cada string pode comportar senão estarias a aceder a memória indevida.


here since 2009

Share this post


Link to post
Share on other sites
Strabush

E se restringisse o 1º "i" á 52 e o 2º á 92. Aconteceria a mesma coisa?

Share this post


Link to post
Share on other sites
Localhost

Se o número de strings for maior do que o número de caracteres que as strings podem comportar e se acederes da maneira como estavas a aceder vai originar um buffer overflow. Podes experimentar.

No meu último post enganei-me, era menor em vez de maior, já editei.


here since 2009

Share this post


Link to post
Share on other sites
JoaoNascimento

Tenho a mesma duvida que o martinhocosta...

Só que tenho o codigo um pouco diferente, tenho um vector de estruturas e não os campos das estruturas sendo vectores...

Estrutura:

typedef struct dados
{
char curso[50], nomeuc[50], doc_res[50], area_cientifica[50];
float t, tp, pl, p, ac, ot, s, turm_t,turm_tp, turm_p, turm_pl, turm_ac, turm_ot, turm_s, docentes;
int ects, opcional, ano, semestre;
} DADOS;

Função para ler os dados:

void ler_dados_fich(DADOS *uc, int num)
{
char cabecalho[1000];
int i=0;
FILE *pfdados;

pfdados=fopen("dados_ucs_070410.txt","r");

if(pfdados==NULL)
{
	printf("Erro ao abrir o ficheiro! \n");
	system("pause");
}

fscanf(pfdados,"[^\n]\n",cabecalho);
//printf("%s\n",cabecalho);

for (i=0;i<num;i++)
    {
	fscanf( pfdados , "[^\t]\t%d\t%d\t%[^\t]\t%d\t%[^\t]\t%d\t%[^\t]\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f",uc[i].curso,&uc[i].ano,&uc[i].semestre,uc[i].nomeuc,&uc[i].ects,uc[i].area_cientifica,&uc[i].opcional,uc[i].doc_res,&uc[i].docentes,&uc[i].turm_t,&uc[i].turm_tp,&uc[i].turm_p,&uc[i].turm_pl,&uc[i].turm_ac,&uc[i].turm_ot,&uc[i].turm_s,&uc[i].t,&uc[i].tp,&uc[i].p,&uc[i].pl,&uc[i].ac,&uc[i].ot,&uc[i].s);
}
fclose(pfdados);
}

Devo referir que o vector esta definido assim no main: 

DADOS uc[N];

. Sendo o N = 92...

Codigo completo aqui-> http://www.pastie.org/959481

Share this post


Link to post
Share on other sites
Localhost

Se *uc* for alocado dinamicamente vais ter de usar um ponteiro para ponteiro.


here since 2009

Share this post


Link to post
Share on other sites
Localhost

É usado quando estás a usar ponteiros que apontam para estruturas.

Resolveu o problema?


here since 2009

Share this post


Link to post
Share on other sites
fo_11

Estive a ver o teu código e já está um puco extenso. Já consideraste em dividir o programa em vários ficheiros?

Fica o conselho

Share this post


Link to post
Share on other sites
fo_11

Basicamente é dividires o programa em bibliotecas... Isto é, partes do programa que são independentes podes efectuar então uma divisão aí. Depois fazes a inclusao das bibliotecas que criaste como fazes com o <stdio.h>

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

×

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.