Lendo uma linha específica de um arquivo [RESOLVIDO]

1. Lendo uma linha específica de um arquivo [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/05/2016 - 16:41h

Boa noite;
Então pessoal, a minha dúvida é simples... seguinte; eu consigo ler todas as linhas de um arquivo em texto até o final e calcular a quantidade de linhas, até ai não vejo nenhum mistério. Porém como faço para ler uma linha específica? já fiz vários testes usando a função fseek() para reposicionar o ponteiro na linha que eu quero e então armazenar a string em alguma variável, mas sem sucesso. Em algumas pesquisas achei muito pouco material para estudo sobre essa função, acredito que eu esteja usando-a de uma maneira "burra" (errada), então fiquei um tanto perdido.
Outra possível solução que pensei foi varrer a variável que armazena o conteúdo do arquivo usando um laço for e então armazenar as strings em algum vetor, mas também não obtive sucesso.
Segue o code:
#include <stdlib.h>
#include <stdio.h>
int content(){
FILE *content;
char content_output[200];
int aux,line=0,count=0;

if((content=fopen("/root/custom_open.path","r"))==NULL)
{
exit(1);
}
else
{
while(fgets(content_output,sizeof(content_output),content)!=NULL)
{
line=1;
for(aux=0;content_output[aux];aux++)
if(content_output[aux]=='\n')
{
count++;
printf("%s",content_output);
}
}
if(line)
{
printf("\n%d conf files\n",count);
}
}
fclose(content);
return 0;
}
int main(void){
content();
return 0;
}

Output:
/root/open
/root/open1
/root/open2
/root/open3

4 conf files

O output saiu como o esperado. Mas a ideia "separar" as linhas para uma posterior checagem dos arquivos. O problema é que eu não consigo ler uma determinada linha e armazena-la, para então poder fazer o que eu quero.
Eu acredito que a solução seja a função fseek(), alguma indicação de material ou code para estudo?
agradeço desde já a intenção de ajudar. :)



  


2. Re: Lendo uma linha específica de um arquivo

???
gokernel

(usa Linux Mint)

Enviado em 26/05/2016 - 17:49h


Simples: ...

Codigo genérico:



int linha = 0;

while ( fgets(...) ) {

if (linha == NUMERO_DA_LINHA) {
// faz alguma coisa ... e caso queira sai
}

linha++;

}//: while ( fgets(...) ) {

fclose (...);



Simples ???



3. Re: Lendo uma linha específica de um arquivo

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 26/05/2016 - 20:26h

Você pode usar a função fseek com o parâmetro SEEK_CUR e debugar com a função ftell.

SEEK_SET - Início do arquivo.
SEEK_CUR - Posição corrente do arquivo.
SEEK_END - Fim de arquivo.


Dê uma olha nisso

http://www.gnu.org/software/libc/manual/html_node/File-Positioning.html

boa sorte!


4. Re: Lendo uma linha específica de um arquivo [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 27/05/2016 - 03:36h

As funções de deslocamento do ponteiro de arquivo trabalham apenas com bytes. Reconhecer onde começa e onde termina cada linha de texto é uma tarefa do seu programa.

Isso acaba obrigando você a, se quiser apenas uma linha N, ler e reconhecer todas as N-1 que vêm antes dela.


5. Re: Lendo uma linha específica de um arquivo

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/05/2016 - 15:36h

Segue o novo code:
#include <stdlib.h>
#include <stdio.h>
int content(){
FILE *content,*check;
char content_output[200];
int aux,line=0;

if((content=fopen("/root/custom_open.path","r"))==NULL)
{
perror("(content)");
exit(1);
}
else
{
while(fgets(content_output,sizeof(content_output),content)!=NULL)
{
for(aux=0;content_output[aux];aux++)
if(content_output[aux]=='\n')
{
line++;
printf("Line %d: %s",line,content_output);
}
if(line==1) //Linha 1.
{
if((check=fopen(content_output,"r"))==NULL) //Não funciona se eu usar a váriável do conteúdo "content_output", no caso passando a ser o valor da linha 1. (?)
{ //Mesmo o arquivo existindo, usando a variável do conteúdo o "printf" abaixo é impresso. (?)
printf("File %d: not found\n",line);
exit(0); //exit de segurança.
if((check=fopen(content_output,"w"))==NULL)
{
perror("(check)");
exit(1);
}
else
{
if(line==1)
{
line=0; //Passando pelos "ifs" e chegando auqi, removeria a linha 1 de "custom_open.path" certo?
//O que de fato acontece é que apaga todo o conteúdo do arquivo. (?)
fclose(check);
}
}
}
else
{
printf("Found: %s\n",content_output);
fclose(check);
}
}
}
fclose(content);
}
return 0;
}
int main(void){
content();
return 0;
}


Output:
BSD4LIFE# ls -li /root/open1;./content2
393225 -rw-r--r-- 1 root root 1 May 28 08:40 /root/open1
Line 1: /root/open1
File 1: not found

Observação:
Já fiz os testes para me certificar que o valor da linha 1 seja passado para "content_output", e de fato é, mas quando passo "content_output" para o ponteiro de arquivo "check", o arquivo não é aberto/lido sendo que ele existe. Não entendi isso.
Resolvendo isso, já seria um belo caminho andado, depois eu me viro com remover caminhos de arquivos inexistentes em "custom_open.path". Comentei para exemplificar onde as coisas dão errado.

Só pra deixar claro: não estou pedindo nada pronto pessoal, só quero entender o que acontece mesmo.
--
Just bring us some beers, and then we can talk about our systems. :)


6. Re: Lendo uma linha específica de um arquivo [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/05/2016 - 21:29h

Bom camarada, seria bom você manter o conteúdo original, e ir fazendo novas perguntas em novas postagens, até para a gente ter uma ideia de como é que a conversa chegou no ponto em que chegou.

Não sei se entendi sua dúvida de agora, mas parece que está relacionada ao comportamento de fopen(). Você já leu sua documentação, para entender como funciona cada modo de abertura?


7. Re: Lendo uma linha específica de um arquivo

Perfil removido
removido

(usa Nenhuma)

Enviado em 28/05/2016 - 21:40h

Bom, eu achei que editando o post seria o melhor a se fazer, mas vou fazer outras postagens então.
Já li sim paulo1205, já li vários exemplos também e manuais da função... apenas não entendi o porquê de não ter aberto o arquivo.



Veja só esta linha:
if((check=fopen(content_output,"r"))==NULL) 

é o equivalente a:
if((check=fopen("/root/open1","r"))==NULL) 

que é a primeira linha do tal arquivo que preciso ler "custom_open.path", mas como eu disse... passando a variável "content_output" para "check", o arquivo não é aberto, sendo que o arquivo existe, e é "/root/open1". Se tu compilar ai, criar os arquivos e testar, e imprimir o valor de "content_output" dentro do "if(line==1)", o valor é "/root/open1". Eu imagino que a resolução seja simples, e com certeza o erro seja meu, mas eu não sei como resolve-lo, ainda.
--
Just bring us some beers, and then we can talk about our systems. :)



8. Re: Lendo uma linha específica de um arquivo

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/05/2016 - 01:14h

Parece-me que você está lendo os nomes dos arquivos de um arquivo de nomes, com um nome por linha. Mas eu não vi você remover o '\n' do final de cada nome depois de ler a linha.

Curiosamente, você testa a presença do '\n' para saber que a linha está completa -- o que é certo --, mas não extirpa esse caráter antes de usar a string para abrir o arquivo.


9. Re: Lendo uma linha específica de um arquivo

Perfil removido
removido

(usa Nenhuma)

Enviado em 31/05/2016 - 18:00h

Nossa, que deslize paulo1205.
Uma simples quebra de linha estava quebrando a abertura do arquivo, era isso mesmo.
for(aux=0;content_output[aux];aux++)
if(content_output[aux]=='\n') content_output[aux]=0;

Resolvido eliminando o caractere de quebra de linha antes de abrir o arquivo.
Valeuu
--
Just bring us some beers, and then we can talk about our systems. :)







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts