Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

Simplificacao programa

Mensagens Recomendadas

fo_11

Aqui está um programa feito por mim que toca na matéria, se podemos assim chamar, ficheiros:

#include<stdio.h>
#include<stdlib.h>
const int MAX=200;
int conta_linh(FILE *fp);

int main()
{
    char linha[MAX],nome[10];
    int i_linh,contador=0,total_linh;
    FILE *fp;//muito importante de não esquecer o asterisco antes da vairavel
    
    do
     {printf("Nome ficheiro==>");
      gets(nome);
      fp=fopen(nome,"r");//quando não se consegue abrir o ficheiro pedido o fopen returna NULL
      if(fp==NULL)
       printf("IMPOSSIVEL ACEDER FICHEIRO");
     }while(fp==NULL);
     
    printf("Inserir inicio:");
    scanf("%d",&i_linh);
    total_linh=conta_linh(fp);
    
    while(!feof(fp))//!feop(fp) tem a funcao de verificar se o ficheiro já chegou ao fim
     {fgets(linha,MAX,fp);              
      if(contador>=i_linh-1)//tem de ser i_linh-1 porque a contagem começa em 0
       puts(linha);
      contador++;
     }
    fclose(fp);
    system("pause");
}

int conta_linh(FILE *fp)
{
    int contador=0;
    while(feof(fp))
     contador++;
    return contador;
    
}

A minha questão é a seguinte, será que é possivel calcular o numero de linhas de um ficheiro sem recorrer a um subprograma? ou terá de ser como está feito neste programa?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Não percebi muito bem o que querias dizer com sub-programa.

Não uses o gets, podes começar por aí para melhorares o programa.

Para fechares a tag code fazes: [ /code ] sem os espaços.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Porque não devo usar o gets? Eu sempre que lido com strings utilizo gets pelo menos fui como aprendi mas tambem sei que posso utilizar scanf mas neste não dá pra inserir uma frase só mesmo uma palavra.

Talvez usei mal o termo sub-programa, o que queria dizer mesmo era função. Eu utilizei esta função int conta_linh(FILE *fp) pra contar o numero de linhas do ficheiro. O que eu queria saber era se existia alguma forma de fazer este programa sem ter que passar por este processo.

O problema proposto é:"Ler um ficheiro e pedir ao utilizador apartir de que linha é que ele pertende visualizar no cmd"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Mas nunca deves usar. Eu fiz há algum tempo um tópico que explicava o buffer overflow (que é uma consequência de usares a função gets).

Deixo aqui: Buffer overflow

O que te pode ajudar com esse programa é a função fseek


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

O tópico sobre buffer overflow está muito bom. Fiquei a perceber  claramenteo que é e os problemas que acarreta.

Mas sendo assim qual é a função que devo usar pra substituir o gets? Já tentei o fgets mas não deu. Outra questão, o fgets não é pra obter strings de um ficheiro?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Podes usar a função fgets, desde que tenhas o cuidado de remover o '\n' lido por esta, e também podes usar o scanf desde que com uma formatação preparada para receber strings:

fgets(str,sizeof(str),stdin);
str[strlen(str)-1]='\0';

scanf("%80[^\n]",str); ////lê no máximo 80 caracteres para uma string ou, caso o input seja menor que 80, lê até encontrar um '\n' que indica mudança de linha

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Baderous, eu utilizava esse scanf formatado desde que tu me disseste no tópico do buffer overflow mas já notei que tem alguns problemas em termos de comparações. Não sei a razão disto mas já testei.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Como assim em termos de comparações? Eu por acaso não costumo usar esse scanf, costumo optar pelo fgets, mas testei agora e não me parece dar nenhum problema:

#include <stdio.h>
#include <string.h>

int main(void) {
        char str[50];
        printf("Introduza a string: ");
        scanf("%50[^\n]",str);
        printf("String lida: %s\n",str);
        if (strcmp(str,"baderous")==0)
                printf("Rox!\n");
        else
                printf("Not rox.\n");
        return 0;
}

Introduza a string: baderous
String lida: baderous
Rox!

Introduza a string: askdhadbhaksdbhaksdhbaskdbasjhdbasjhdbasjhdbajshbdajshbdajhsbdjahsbdjahbdjhabdjhabsdjhasbdjhasbdjhasbdjhabdjhabdjhabjabsdjhabsdjhabsdjhbasjhdbasdjhasbdad
String lida: askdhadbhaksdbhaksdhbaskdbasjhdbasjhdbasjhdbajshbd
Not rox.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.