Ir ao conteúdo
  • Cadastre-se

C Ler numero de '\n' em um arquivo


Posts recomendados

Bom Dia, tenho que fazer um algoritmo que recebe um arquivo e devolve quantas linhas ele tem. Sei que tenho que trabalhar com a contagem de '\n' no arquivo, mas não sei ao certo como fazer isso. Fiz um código mas não esta funcionando corretamente... Alguem por favor pode me dar uma ajuda ou apontar o erro? Muito obrigado :)

 



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

int main()
{
    char str[50];
    int result;
    FILE *arq;

    arq = fopen("ArqGrav.txt","r");

    if(arq == NULL){
        printf("problema na criação do arquivo\n");
        system("pause");
        exit(1);
    }

    result = fgets(str,50,arq);

    int cont,i = 0;

    for (i = 0; str != '\0'; i++) {
        if(str == '\n'){
            cont++;
        }
    }

    fclose(arq);

    printf("%d",cont);
    return 0;
}

 

Link para o comentário
Compartilhar em outros sites

Olá!

 

Talvez esteja fazendo muito mais do que precisa. Leia apenas letra a letra e conte os tais '\n' ou 10 mesmo já que esse é o código do newline e esse é o enunciado

 

De todo modo seu programa parece quase funcionar. Mas tem uma certa ironia: cada string termina por um '\n' porque você está lendo via gets() então basta você contar as strings. Dá na mesma!

 

Por outro lado...

 

  • E se str[] fosse "" ainda assim seria uma linha... Uma linha em branco é uma linha...
  • E você nunca vai encontrar um '\n' na string porque esse é o sinal para gets() retornar ;) 
  • Você tem um livro-texto? Qual é? Tem uma apostila? Essa é a declaraçao de fgets()
    char *fgets(char *str, int n, FILE *stream)

    Ela retorna char* e não int...

 

Entendeu? 

 

Mas veja esse trecho de seu programa:

 

   char str[50];

...

    result = fgets(str,50,arq);

...

    for (i = 0; str != '\0'; i++)
    {
        if(str == '\n')
        {
            cont++;
        }
    }

...


}

Esse if() nunca vai achar nada então não vai somar em cont, mas o total de linhas já está em i :D 


Uma pequena mudança e estaria bem:

 

Esse funciona mas é ruim de ler

    for (cont = 0; ((res = fgets(str, 50, arq)) != NULL); cont++);

voce começa claro com cont = 0. Continua lendo até fgets() retornar NULL. E conta as vezes.


Claro que é a mesma coisa que escrever

    for (cont = 0; ((res = fgets(str, 50, arq)) != NULL); cont++)
    {
        // nada a fazer: era so para somar em cont
    };

E assim é mais fácil de ler

    while ((res = fgets(str, 50, arq)) != NULL) cont++;

Pense nesses e escreva de volta

 

 

adicionado 15 minutos depois

Acabei esquecendo de incluir o que falei sobre contar os '\n'. Esse seria o normal

    
    arq = fopen("ArqGrav.txt", "r");
    cont = 0;
    char c = 0;
    while (!feof(arq))
        if ((c = fgetc(arq)) == '\n') cont++;
    fclose(arq);
    printf("%d\n", cont);

 

Enquanto não acabar o arquivo se ler um newline conta. Direto ao assunto. Não precisa das chaves no while() porque só tem uma linha o loop. Podia escrever como está abaixo

    
    arq = fopen("ArqGrav.txt", "r");
    cont = 0;
    char c = 0;
    while (!feof(arq))
    {
        if ((c = fgetc(arq)) == '\n')
        {
            cont += 1;
        }
    }
    fclose(arq);
    printf("%d\n", cont);

Evite cont++ :  De todas as possibilidades de incremento é a mais problemática. Ao menos use ++cont;

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!