Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

dnascimento

fgets

Mensagens Recomendadas

dnascimento

while(fgets(s,MAX_CARACTER+1,fp) != NULL)
{
	s[strlen(s)-1]='\0'; /*Retira o \n */

	if(mostra_linhas) /* 0 = falso, != 0 = true */
		fprintf(stdout,"%d : %d\n",++n_linha,strlen(s)); /*Incrementa o n da linha e mostra o comprimento da string s, retirada no fgets */

		else
			fprintf(stdout,"%d\n",strlen(s));
		}

Estou com alguma dificuldade em compreender este ciclo while. Este ciclo deverá ler o ficheiro apontado por fp. O numero máximo de caracteres é de MAX_CARACTER+1.  Só não compreendo exactamente a função fgets.

fgets (char *str, int tamanho,FILE *fp);

Vai ao ponteiro fp buscar o ficheiro e lê uma string do tamanho "tamanho" ou que seja uma linha (\n) e guarda-a num banco de memória apontado por str.

Supondo agora que há mais do que uma linha, como é que o fgets vai avançar? :S É isso que não percebo neste ciclo, como é que é incrementado...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Não tenho completa certeza mas acho que o fgets funciona como o fscanf que lê e na seguinte chamada a função lê desde onde parou na última vez. No caso do fscanf lê uma linha de cada vez.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dnascimento

Já percebi o ciclo.

O fgets le o ficheiro até que surja um new line (\n) ou o EOF (end of file) ou seja atingido o máximo de caracteres. Vai "eliminando" os caracteres copiados até que chegue ao final. Quando chega ao final não tem nada para devolver, devolve NULL e o ciclo termina  :P

Está a ser dificil dominar bem a linguagem C... Vai demorar algum tempo...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

O fgets lê N caracteres (que é o teu 2º argumento na chamada à função). Ou seja, com um loop ele vai ler desde onde parou da última vez.

Não tenho completa certeza mas acho que o fgets funciona como o fscanf que lê e na seguinte chamada a função lê desde onde parou na última vez. No caso do fscanf lê uma linha de cada vez.

p.s. Não desistas :P


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dnascimento

O fgets lê N caracteres (que é o teu 2º argumento na chamada à função). Ou seja, com um loop ele vai ler desde onde parou da última vez.

p.s. Não desistas :P

O que ainda me faz mais confusão é tratar os streams (ficheiros) como uma sequência de dados introduzidos tal como se fosse o teclado. E depois tratar do vector argv que recebe os dados da linha de comandos.

Se introduzir na consola: nome_programa abcd efgh

main(int argc,int **argv)

Ora argc = 3.

argv[0]==nome_programa

argv[1]==abcd

argv[2]==efgh

Se quiser aceder ao caracter 'g' posso fazer: argv[2][2] certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Argv é um array de ponteiros para o primeiro elemento dos argumentos passados pela linha de comandos que são strings.

Ou seja, tu ao fazeres argv[2][2] está a aceder ao segundo ponteiro do array e ao segundo caracter da string apontada pelo segundo ponteiro.

p.s. Acho que se calhar o que te está a causar confusão é o facto de ser declarado como **argv mas se pensares bem é mesmo um ponteiro para um ponteiro porque é um array de ponteiros que aponta para strings. Como o nome de uma string ou de um array é um ponteiro para o seu primeiro elemento tens de utilizar um ponteiro para um ponteiro. Mas também pode ser declarado assim: char *argv[]


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dnascimento

Obrigado pela ajuda  :P :P Já estou a começar a perceber... Vai com o tempo, 2 semanas aos pedaços para aprender uma linguagem não chega  :-[ Agora é mesmo estudar e avançar.

P.S.: Acede ao 3º caractere ou ao 2º? A string de cada elemento do argv também começa por 0 certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Lol, desculpa. Eu é que costumo começar a contar sempre do zero. Estava a querer referir-me à segunda posição a contar de 0.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Já percebeste aquilo do argv? Atenção a uma coisa, o próprio "nome" argv é também um ponteiro para o seu 1º elemento, visto que argv é um array como os outros.


here since 2009

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.