antiblock
diamwall
  • Chatbox

    You don't have permission to chat.
    Load More
Sign in to follow this  
davidcbbcXXIV

Ler linhas de ficheiro txt

3 posts in this topic

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
antiblock
Elveron

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 by DownD (see edit history)

Share this post


Link to post
Share on other sites
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

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
Sign in to follow this