Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
fo_11

Simplificacao programa

Recommended Posts

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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
fo_11

Ok, obrigado pela ajuda.

Só mais uma questão pra finalizar.

Qual o significado de stdin ou porque colocamos stdin no fgets?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
Localhost

A mim não me comapara em condições :dontgetit:

Mas já é off-topic.


here since 2009

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.