Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Thais Tesck

ler determinada linha de um arquivo

Recommended Posts

Olá ;

Enfim , estou com um problema em ler um arquivo e imprimir somente a terceira linha por exemplo ;
Sei como ler o arquivo inteiro somente , agora to com problemas em imprimir somente a linha que eu quero ;

Se puderem me ajudar , desde já agradeço.

 

 

 

Código somente lendo o arquivo inteiro .

#include <stdio.h>
#include <stdlib.h>
int main()
{
	
FILE *arquivo = fopen("C:\\Users\\PC\\Documents\\thais\\algoritimos\\alunos.txt", "r+"); // cria ou abre o arquivo
if(arquivo == NULL) // testa se o arquivo foi aberto com sucesso
 {
 printf("\n\nImpossivel abrir o arquivo!\n\n");
 return 0;
 }
 
  char Linha[100];
  
    while (!feof(arquivo))
  {
		fgets(Linha, 100, arquivo);	
		   	  printf("%s",Linha);
     
 }
  fclose(arquivo);
  
  return 0;
 
 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então , sou nova nisso , quando diz contador , não sei exatamente como usá-lo , nem como faze-lo .

 

Fiz um "contador " dessa forma :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

  FILE *arquivo = fopen("C:\\Users\\PC\\Documents\\thais\\algoritimos\\alunos.txt", "r");
  int caractere, existe_linhas = 0;
  int quant_linhas = 0;
  
  while((caractere = fgetc(arquivo)) != EOF){
    existe_linhas = 3; 
    
    if(caractere == '\n'){ 
      quant_linhas++;             
    } 
  }

  if(existe_linhas)
    quant_linhas ++;

  printf("O arquivo possui %d linhas.\n",quant_linhas );
  
  	
  return 0;
}

Não sei se está correto , porém preciso de ajuda , se puderem dar uma dica de como fazer um contador correto caso esteja errado, agradeço .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como a Isis mencionou acima, um contador é uma variável do tipo inteiro que irá contar a ocorrência de uma determinada ocorrência, por exemplo.

 

vamos supor que você tenha um arquivo com algumas linhas de texto

 

Jaca é bom, mas java não.
Tio Stallman disse para edentar direitinho.
Hoje preciso tomar café dobrado.
...
N -> Linhas

 

E quando você for ler este arquivo, declaro uma variável do tipo inteiro com valor inicial 1(Geralmente começa com 0, mas neste caso inicia com 1). E a cada vez que ler uma linha, esta variável irá incrementar (Cujo contador).

 

 

int contador = 1;
 
while(!file.eof())
{
//Fazer alguma coisa
++contador;
}

 

Com este contador, você poderá escolher qual linha pegar.

 

 

 
int pegarLinha = 2;
while(!file.eof())
{
   if(pegarLinha == contador)
  {
    cout << "Esta é minha linha: " << line;
  }
++contador;
}
 

Compartilhar este post


Link para o post
Compartilhar em outros sites
int contador = 1;
 
while(!file.eof())
{
  //Fazer alguma coisa
  ++contador;
}

E se o arquivo estivesse vazio? Esse 1 seria de onde?

 

Não iria acontecer nada. O IF que compara a linha que o usuário quer está dentro do while e se o arquivo estiver vazio o while nem entrará no loop.

int contador = 1;
while(!file.eof())
{
   if(pegarLinha == contador)
  {

    cout << "Esta é minha linha: " << line;
  
    break;
  }
++contador;
}

Para melhorar, coloquei um break; dentro do IF.

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpa minha ignorância ,

tentei fazer o código agora da forma que você explicou , porem não estou conseguindo imprimir

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *file;
    file = fopen("anexo.txt", "r");
    if(!file){
        printf("erro abrindo arquivo\n");
        return 0;
    }
    
    int contador =1;
    char  pegarLinha = 2;
 
while(contador != EOF)

   if(pegarLinha == contador)
  
   
++contador;
 
 printf("%s", pegarlinha);
 
	fclose(file);


return 0;

}

aparece que é alguma coisa errada com o printf .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você declarou a variável com "L" maiúsculo, porém, está usando em "printf()" com ele em minúsculo.

 

Outra coisa no "printf()", a máscara para mostrar caracter é "%c".

A máscara "%s" é para strings, mostra o conteúdo até encontrar um terminador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

desculpa minha ignorância ,

tentei fazer o código agora da forma que você explicou , porem não estou conseguindo imprimir

#include <stdio.h>
#include <stdlib.h>

int main(){

    FILE *file;
    file = fopen("anexo.txt", "r");
    if(!file){
        printf("erro abrindo arquivo\n");
        return 0;
    }
    
    int contador =1;
    char  pegarLinha = 2;
 
while(contador != EOF)

   if(pegarLinha == contador)
  
   
++contador;
 
 printf("%s", pegarlinha);
 
	fclose(file);


return 0;

}

aparece que é alguma coisa errada com o printf .

O codigo não ficaria bem assim.

Gostaria que você observasse bem seu código, você está errando em alguns pontos

Veja:

 

 

...
 
while(contador != EOF)
... 
 
 

 

?de onde saiu isso? e voce nao abriu o bloco { e } do WHILE e IF, está ocorrendo erros de semântica.

 

Vou te mostrar como ficaria o código, mas se quiser ficar bom treine mais.

 

 

#include <stdio.h>
#include <stdlib.h>

bool seekLine(FILE *f, int lineNumber, char *line)

{

   //Este código funcionará diferente em relação ao outro.

   int currentSeek = ftell(f);
   fseek(f, 0, SEEK_SET);
   while( --lineNumber && (fgets(line, 256, f) != NULL) );

   //Isso mesmo, coloquei ponto e virgula depois do WHILE, pois quero que o ponteiro(seek) dentro do arquivo aponte para uma linha anterior da que queremos.

 
   if(!lineNumber) // Se lineNumber é 0 escontramos nossa linha, avançamos e a colocamos no buffer
      fgets(line, 256, f);

   fseek(f, currentSeek, SEEK_SET);

  return !lineNumber;

   //Retorna que não encontrou, mas matem a ultima linha encontrada.

     //Viu? aqui não abri o bloco, porque só quero "rodar" uma linha mesmo.
    

}


int main(){

FILE *file;
file = fopen("t.txt", "r");
if(!file){
printf("erro abrindo arquivo\n");
return 0;
}
 
    char line[256];
    int quero = 10; // Digite aqui qual linha pegar


    if( seekLine(file, quero, line) )
        printf("Number line %d: %s\n", quero, line);
    else
       printf("Não existe a linha %d ou o arquivo está vazio\n", quero);

    fclose(file);


return 0;

}

 

 

 

obs: Mesmo se não abrir o bloco do WHILE e IF, o código irá compilar, mas o que estará em seu escopo será somente a próxima linha depois de sua definição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Existe várias formas de fazer isso... Mas como já citaram a forma mais básica (com contador)...
Então vai um exemplo diferente...

#include <stdio.h>

int main()
{
FILE *fd;
int line = 0;
int line_len = 0;
int c;

fd = fopen("texto.txt", "r");

//Vai ler o arquivo até a terceira linha
//e contar o tamanho da terceira linha
//Está sendo usado getc pra saber o tamanho exato da linha
while ( (c = getc(fd)) != EOF & line < 3)
{
if (line == 2)
line_len++;
if (c == '\n')
line++;
}

//ou line_len++
ungetc(c, fd);

//Volta -tamanho da linha no arquivo (início da terceira linha) a partir da posição
//atual do arquivo (No caso está no final da terceira linha).
fseek(fd, -line_len, SEEK_CUR);
char line_value[line_len];
fgets(line_value, line_len, fd);
puts(line_value);
return 0;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quem quer aprender não vai entender direito linha de códigos complicadas!

#include <stdio.h>

int main(){

   FILE *fp = fopen("r.txt", "r");
   char caractere;   
   int linha=1;  

while((caractere = fgetc(fp)) != EOF){              //percorre o arquivo caractere por caractere e checa para ver se já esta no fim do mesmo!
	if(linha==3 && caractere!='\n'){                   //se estiver na linha 3 e o caractere for diferente de quebra de linha execulta
		printf("%c",caractere);                        //printa o caractere em questão
	}
	if(caractere=='\n'){     //procura quebra de linha e execulta quando encontrar		
		linha++;             //incrementa linha, informando que pulou a linha
	}
	
}
if(linha<3){
	printf("Não existe linha 3 no seu arquivo");
}

}


Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Quem quer aprender não vai entender direito linha de códigos complicadas!

#include <stdio.h>

int main(){

   FILE *fp = fopen("r.txt", "r");
   char caractere;   
   int linha=1;  

while((caractere = fgetc(fp)) != EOF){              //percorre o arquivo caractere por caractere e checa para ver se já esta no fim do mesmo!
	if(linha==3 && caractere!='\n'){                   //se estiver na linha 3 e o caractere for diferente de quebra de linha execulta
		printf("%c",caractere);                        //printa o caractere em questão
	}
	if(caractere=='\n'){     //procura quebra de linha e execulta quando encontrar		
		linha++;             //incrementa linha, informando que pulou a linha
	}
	
}
if(linha<3){
	printf("Não existe linha 3 no seu arquivo");
}

}


 

 

Cara brigadão , você entendeu o que eu queria . Explicou passo a passo e na linha de códigos que eu possa entender . vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.