BahausMen Posted May 16, 2014 at 11:04 AM Report #555914 Posted May 16, 2014 at 11:04 AM 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; }
HappyHippyHippo Posted May 16, 2014 at 11:05 AM Report #555915 Posted May 16, 2014 at 11:05 AM O meu problema é que ele esta-me a descartar o primeiro letra da frase. while (fgetc(fp)!= EOF){ // <------------- o que achas que está a acontecer aqui ??? usa a função fgets IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
BahausMen Posted May 16, 2014 at 11:11 AM Author Report #555916 Posted May 16, 2014 at 11:11 AM (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 May 16, 2014 at 11:21 AM by BahausMen
HappyHippyHippo Posted May 16, 2014 at 11:34 AM Report #555924 Posted May 16, 2014 at 11:34 AM O meu problema é que ele esta-me a descartar o primeiro letra da frase. while (fgetc(fp)!= EOF){ // <------------- o que achas que está a acontecer aqui ??? [/code] IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
BahausMen Posted May 16, 2014 at 12:30 PM Author Report #555934 Posted May 16, 2014 at 12:30 PM (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 May 16, 2014 at 12:44 PM by BahausMen
11001 Posted May 18, 2014 at 12:37 AM Report #556115 Posted May 18, 2014 at 12:37 AM Podes usar a função getline() fica aqui a respectiva documentação -- http://man7.org/linux/man-pages/man3/getline.3.html Ou podes igualmente, para treinares,tentar implementar uma função readLine, usando system calls e alocação/realocação de memória.
HappyHippyHippo Posted May 18, 2014 at 05:09 AM Report #556120 Posted May 18, 2014 at 05:09 AM 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? pensa em coisas mais produtivas primeiro ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
mantos123 Posted May 19, 2014 at 07:46 PM Report #556294 Posted May 19, 2014 at 07:46 PM (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 May 19, 2014 at 08:13 PM by thoga31 GeSHi
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now