Jump to content

Recommended Posts

Posted

Boas,

Eu tenho um ficheiro (.txt) e estou a ler as linhas (uma de cada vez).

O meu problema é que ele esta-me a descartar o primeiro letra da frase.

>> Ler linha do C

da-me como output

>> er linha do C

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
FILE * fp;		

size_t len = 0;
char * linha = NULL;

/* Abrir o ficheiro */
fp = fopen("gripe", "r");


while (fgetc(fp)!= EOF){

	getline(&linha,&len,fp);
	printf("%s\n",linha );
}

/* Fechar o ficheiro */
fclose(fp);


/* Terminar o programa */
return 0;
}
Posted (edited)

usa a função fgets

Está a ler caracter a caracter até terminou o ficheiro.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
   FILE * fp;		   /* apontador para o ficheiro */
				   /* variavel para guarda a linha */
   size_t len = 1000;
   char * linha = NULL;

   /* Abrir o ficheiro */
   fp = fopen("gripe", "r");


   while (fgetc(fp)!= EOF){

    fgets(linha,len,fp);
    printf("%s\n",linha );
   }

   /* Fechar o ficheiro */
   fclose(fp);


   /* Terminar o programa */
   return 0;
}

mudei o meu código mas continua o mesmo problema.

Edited by BahausMen
Posted (edited)

thanks, já resolvi.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
FILE * fp;		   /* apontador para o ficheiro */
				   /* variavel para guarda a linha */
size_t len = 0;
char linha[500];

/* Abrir o ficheiro */
fp = fopen("gripe", "r");


while ( fgets ( linha, sizeof linha, fp ) != NULL ) {

		printf("\n%s",linha);
	}


/* Fechar o ficheiro */
fclose(fp);


/* Terminar o programa */
return 0;
}

Eu estou a alocar um valor fixo por linha (máximo) ... como é que poderia alocar o espaço ideial por linha , para não ter um gasto de memória tão grande?

char * linha = NULL;

// depois no malloc
while (fgets(linha,sizeof linha,fp)!=NULL) 

tentei assim numa primeira versão, mas está mal. 
Edited by BahausMen
Posted (edited)

para verificar se estás no fim do ficheiro , sem realmente andares com o "cursor de leitura" (evitando assim descartar seja o que for), pode fazer assim

while(!feof(fp)){

//faz qualquer coisa

}

quanto à questão da alocação dimânica da memória podes sempre abrir o ficheiro duas vezes e fazer o seguinte:

int c=0;
while( !feof(fp)){
fgetc(fp);
c++;
}
fclose(fp);
char a* = (char *)malloc((sizeof(char)*c)+1); // aqui allocas um array com o tamanho certo para a guardares o texto todo
char aux[60];
fp = fopen(/*caminho do ficheiro*/);
while( !feof(fp)){
fgets(aux,60, fp);
strcat(a,aux);
}

este códig poderá não estra 100% certo, mas se estás a começar agora, consegues ter uma breve noção de como fazer, no entanto há formas mais seguras e mais eficazes de o fazeres

Edited by thoga31
GeSHi

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
×
×
  • Create New...

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.