Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
dnascimento

fgets

Recommended Posts

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...

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

Share this post


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

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  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.