norderzon 0 Denunciar post Postado Dezembro 7, 2008 oi estou a fazer um programa que vai listar directorias e ler um ficheiro especifico de cada directoria Eu so preciso de listar 2 linhas de cada ficheiro e não consigo fazer há alguma funcao para listar linhas especificas de um ficheiro? Parte do meu codigo dir=opendir("/proc"); for(i=0;i<MAX_ENTRIES && (entry=readdir(dir))!=NULL;i++) { val=strtol(entry->d_name,NULL,10); if(val!=0) { printf("directoria: %ld",val); sprintf(aux,"%ld",val); sprintf(path,"%s/%s",proc,aux); sprintf(real_path,"%s/%s",path,status); f=fopen(real_path,"r"); while(fgets(linha,100,f)!=NULL) { /*aki so preciso de 2 linhas especificas e nao do ficheiro todo*/ printf("Linha: %s",linha); } } fclose(f); } closedir(dir); Agradeço qq ajuda Obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 8, 2008 Para pegar só uma parte do arquivo, você pdoe usar fseek() ou ir dando fgets() até chegar na linha desejada. Compartilhar este post Link para o post Compartilhar em outros sites
norderzon 0 Denunciar post Postado Dezembro 8, 2008 o meu problema é k o ficheiro vai ter umas 30 linha e eu só preciso da 2 e da 16 com o meu codigo eu listo todas e uso o fgets fseek ja pesquisei mas so encontro exemplos para o fim do ficheiro que no meu caso não é o desejado e possivel arranjar um exemplo do fseek ou outra maneira de usar o fgets obrigado Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 8, 2008 http://www.cplusplus.com/reference/clibrar...tdio/fseek.html Você só vai poder usar fseek() se souber o número de caracteres em cada linha, pois você tem que mover o ponteiro segundo o número de bytes Compartilhar este post Link para o post Compartilhar em outros sites
norderzon 0 Denunciar post Postado Dezembro 8, 2008 vi o seu link e penso que o fseek() não é a função que preciso para listar a 2 e 16 linha de um arquivo há outra maneira de fazer com o fgets() ou outra funcao qualquer? Compartilhar este post Link para o post Compartilhar em outros sites
José Enésio 4 Denunciar post Postado Dezembro 8, 2008 fgets Syntax: #include <stdio.h> char *fgets( char *str, int num, FILE *stream ); The function fgets() reads up to num - 1 characters from the given file stream and dumps them into str. fgets() will stop when it reaches the end of a line, in which case str will be terminated with a newline. If fgets() reaches num - 1 characters or encounters the EOF, str will be null-terminated. fgets() returns str on success, and NULL on an error. Imagino que sim. É só ir lendo que ele vai lendo por linhas. Mas lembre-se de verificar se o último caractere da string lida é \0, pois isso indica que provavelmente tem mais coisas na linha e isso significa que não leu uma linha inteira. Não tenho certeza sobre o funcionamento do bagulho, mas imagino que seria útil também verificar se o penúltimo caractere é \n, não sei direito como funciona a função mas imagino que depois do \n viria um \0 que termina a string, e no caso o bagulho poderia te enganar e tu achar que não leu uma linha toda, mas leu. Mas, como eu disse, não sei como funciona, tem que esperar o pessoal que sabe direitinho responder. Compartilhar este post Link para o post Compartilhar em outros sites
norderzon 0 Denunciar post Postado Dezembro 9, 2008 obrigado pelas respostas consegui resolver o meu problema usei um contador de linhas e uns ifs, simples mas funcionou bem aqui vai o codigo pode ser que ajude alguem f = fopen(real_path,"r"); contador=0; /*leitura de ficheiro*/ while(fgets(linha,100,f) != NULL) { /*linha do name*/ if(contador==0){ strcpy(nome,linha); } /*linha do state*/ if(contador==16){ strcpy(state,linha); strncpy(estado,state+7,13); } contador++; } fclose(f); precisava da informação da linha 1 e da linha 16 guardo numa variavel e depois imprimo noutro lado Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Dezembro 9, 2008 Se precisa da linha 1 e 16, pegue as linhas 0 e 15, não 0 e 16 Compartilhar este post Link para o post Compartilhar em outros sites