Ir para o conte√ļdo
  • Revista PROGRAMAR: J√° est√° dispon√≠vel a edi√ß√£o #60 da revista programar. Faz j√° o download aqui!

martinhocosta

Guardar dados na struct

Mensagens Recomendadas

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");

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

√Č usado quando est√°s a usar ponteiros que apontam para estruturas.

Resolveu o problema?


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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>

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site voc√™ aceita os nossos Termos de Uso e Pol√≠tica de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informa√ß√Ķes visite esta p√°gina.