davidcbbc 0 Posted December 28, 2017 Report Share Posted December 28, 2017 Olá , tenho andado a programar umas coisas em C e precisava de um código que me lê-se coisas do ficheiro txt ignorado outras: por exemplo , tenho isto no ficheiro txt: nome: teste1 local: porto Queria dar output só de "teste1" e "porto" No entanto , eu arranjei um código que me fornece essa informação: int main(){ char linha[1020]; char teste1[1020]; char teste2[1020]; FILE *fp; fp= fopen("cinemas.txt", "r"); fgets(linha,sizeof(linha),fp); linha[strlen(linha)-1]=0; strcpy(teste1, &linha[6]); fgets(linha,sizeof(linha),fp); linha[strlen(linha)-1]=0; strcpy(teste2, &linha[7]); printf("%s\n",teste1); printf("%s",teste2); fclose(fp); return 0; } Mas não percebo o porquê dele funcionar! supostamente o sizeof() contava o número de bytes que a memória estava a guardar para a string . Se alguém me esclarecesse detalhadamente este código ficava imensamente grato! Link to post Share on other sites
HappyHippyHippo 1,162 Posted December 28, 2017 Report Share Posted December 28, 2017 primeiro, o código não está a fazer o que pretendes, está a fazer output das linhas que está a ler do ficheiro na tua totalidade. segundo, o sizeof devolve o espaço de memória que o seu argumento ocupa, não tem nada haver com strings ou não. IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
davidcbbc 0 Posted December 28, 2017 Author Report Share Posted December 28, 2017 A minha questão é: como funciona aquela linha de código que mostrei? Link to post Share on other sites
HappyHippyHippo 1,162 Posted December 28, 2017 Report Share Posted December 28, 2017 mas tu apresentaste uma data delas !!! afinal qual é a linha que não percebes ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
davidcbbc 0 Posted December 28, 2017 Author Report Share Posted December 28, 2017 fgets(linha,sizeof(linha),fp); linha[strlen(linha)-1]=0; Link to post Share on other sites
Rui Carlos 359 Posted December 28, 2017 Report Share Posted December 28, 2017 3 horas atrás, HappyHippyHippo disse: primeiro, o código não está a fazer o que pretendes, está a fazer output das linhas que está a ler do ficheiro na tua totalidade. Por acaso reparaste nos strcpys? 15 minutos atrás, davidcbbc disse: fgets(linha,sizeof(linha),fp); linha[strlen(linha)-1]=0; Esse código simplesmente lê a linha completa, e depois "remove" o último caracter (que deverá ser o \n, a menos que não leias uma linha completa). O sizeof pouco interessa. Apenas serve para garantir que não lês mais caracteres do que a capacidade do array. Mas as tuas linhas são muito mais pequenas do que a capacidade do array. O "segredo" para o código funcionar está nas chamadas ao strcpy. Sabes o que é que &linha[6] representa? Rui Carlos Gonçalves Link to post Share on other sites
davidcbbc 0 Posted December 28, 2017 Author Report Share Posted December 28, 2017 1 minuto atrás, Rui Carlos disse: Por acaso reparaste nos strcpys? Esse código simplesmente lê a linha completa, e depois "remove" o último caracter (que deverá ser o \n, a menos que não leias uma linha completa). O sizeof pouco interessa. Apenas serve para garantir que não lês mais caracteres do que a capacidade do array. Mas as tuas linhas são muito mais pequenas do que a capacidade do array. O "segredo" para o código funcionar está nas chamadas ao strcpy. Sabes o que é que &linha[6] representa? Sei sim , é apartir desse caracter da linha que ele copia. Link to post Share on other sites
Rui Carlos 359 Posted December 28, 2017 Report Share Posted December 28, 2017 Qual então a razão pela qual achas que o código não devia funcionar? Rui Carlos Gonçalves Link to post Share on other sites
HappyHippyHippo 1,162 Posted December 28, 2017 Report Share Posted December 28, 2017 39 minutes ago, Rui Carlos said: Por acaso reparaste nos strcpys? pois, tens razão ... já estou velho para ver código desnecessariamente complexo ... CÁ GANDA VOLTA !!! IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
davidcbbc 0 Posted December 28, 2017 Author Report Share Posted December 28, 2017 2 horas atrás, HappyHippyHippo disse: pois, tens razão ... já estou velho para ver código desnecessariamente complexo ... CÁ GANDA VOLTA !!! há maneira mais fácil? Peço desculpa pela ignorância , estou a aprender aos poucos.. Link to post Share on other sites
HappyHippyHippo 1,162 Posted December 29, 2017 Report Share Posted December 29, 2017 1 hour ago, davidcbbc said: há maneira mais fácil? Peço desculpa pela ignorância , estou a aprender aos poucos.. int main(){ char valor[32]; FILE *fp; fp = fopen("cinemas.txt", "r"); fscanf("nome: %s\n", valor); printf("%s\n", valor); fscanf("local: %s\n", valor); printf("%s\n", valor); fclose(fp); return 0; } v 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to post Share on other sites
davidcbbc 0 Posted December 29, 2017 Author Report Share Posted December 29, 2017 45 minutos atrás, HappyHippyHippo disse: int main(){ char valor[32]; FILE *fp; fp = fopen("cinemas.txt", "r"); fscanf("nome: %s\n", valor); printf("%s\n", valor); fscanf("local: %s\n", valor); printf("%s\n", valor); fclose(fp); return 0; } v Não sabia que se podia fazer assim, realmente é mais prático! Muito obrigado pela ajuda! Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now