davidcbbcXXIV 3 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! Share this post Link to post Share on other sites
DownD 43 Posted December 29, 2017 (edited) Sizeof(linha) = 1020, visto que char ocupa 1 byte e esse array têm 1020 chares. O sizeof() apenas serve para ter a certeza que não irá existir nenhum overflow, caso a linha a ser lida tenha mais que 1020 caracteres. fgets(char *s, int size, FILE *stream); O que a função gets vai fazer é: ler os caracters até umas das seguintes condições acontecerem: Chegar ao EOF(End Of File) Encontrar '\n' (New Line) Se a linha do ficheiro for maior que "size" (Neste caso apenas iria ser lido os caracters até size-1) Neste caso, apenas as primeiras 2 condições irão acontecer. linha[strlen(linha)-1]=0; Esta instrução serve apenas para ter a certeza que o ultimo caracter lido seja '\0' (ASCII NULL) strcpy(teste1, &linha[6]); Esta função vai copiar o que está no segundo argumento para o primeiro. &linha[6]: Isto significa que vai ser dado o endereço da memoria do array linha na posição "6" O que significa que o array vai ser copiado a partir da posição 6 até encotrar um '\0'(NULL) O resto acho que é simples. Espero ter ajudado :D Edited December 29, 2017 by DownD (see edit history) Share this post Link to post Share on other sites
davidcbbcXXIV 3 Posted January 1, 2018 Em 29/12/2017 at 03:25, DownD disse: Sizeof(linha) = 1020, visto que char ocupa 1 byte e esse array têm 1020 chares. O sizeof() apenas serve para ter a certeza que não irá existir nenhum overflow, caso a linha a ser lida tenha mais que 1020 caracteres. fgets(char *s, int size, FILE *stream); O que a função gets vai fazer é: ler os caracters até umas das seguintes condições acontecerem: Chegar ao EOF(End Of File) Encontrar '\n' (New Line) Se a linha do ficheiro for maior que "size" (Neste caso apenas iria ser lido os caracters até size-1) Neste caso, apenas as primeiras 2 condições irão acontecer. linha[strlen(linha)-1]=0; Esta instrução serve apenas para ter a certeza que o ultimo caracter lido seja '\0' (ASCII NULL) strcpy(teste1, &linha[6]); Esta função vai copiar o que está no segundo argumento para o primeiro. &linha[6]: Isto significa que vai ser dado o endereço da memoria do array linha na posição "6" O que significa que o array vai ser copiado a partir da posição 6 até encotrar um '\0'(NULL) O resto acho que é simples. Espero ter ajudado :D Muito bom!! ajudou imenso , obrigado!! Share this post Link to post Share on other sites