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

suzy

ficheiros duvida! urgente

Mensagens Recomendadas

suzy    0
suzy

:cheesygrin:malta! ajuda, tou agora a começar em ficheiros e isto ta mto complicado :D;):P

tenho este exercicio

Desenvolva um programa que elimine os comentários de um programa em código C

guardado num ficheiro de texto. Considere que os comentários são delimitados pelas

sequências /* … */. O código que resulte da limpeza deve ser guardado num novo ficheiro

(o ficheiro original não deve ser alterado).

Os nomes dos ficheiros de entrada e de saída devem ser fornecidos através da linha de

comando.

eu ainda tentei, mas deve tar tudo errado, como faziam???

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

int main(int argc, char *argv [])
{
s	 FILE *original,*novo;
 char linha[10];

 if(argc!=3)
    printf(" nao e possivel fazer o programa %s\n", argv[0];
	exit(1);
    
     original=fopen(argv[1],"r");

     if(original==null)
        {	 
        printf(" nao posso abrir o ficheiro\n");
        exit(2);
        }
 novo=fopen(argv[2],"w");
     
 if(novo==null)
     {
	 printf(" nao posso abrir o ficheiro\n");
	 exit(3);
	 }


 while(feof(original)==0// se o final do ficheiro for atingido devolve !=0
     {
	 fgets(linha,10,original);
	 if(linha[0]=='/*' || linha[0]=='*\')
	 fputs(linha,novo);
	 }


	 fclose(original);
	 fclose(novo);
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

acho melhor tratar um caracter de cada vez, e através de uma flag ir controlando se está dentro de um bloco de comentários ou não.

a comparação linha[0]=='/*' não faz qualquer sentido, pois /* são dois caracteres. e os comentários terminam com "*/" e não "*\".

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nDray    1
nDray

Esse programa vai terminar antes sequer de abrir o ficheiro....

Usa sempre chavetas (  { }  ), mesmo quando só tens uma instrução, e vê se sabes ao que me refiro.

O resto, tal como te disseram, não faz sentido.....

O meu conselho seria, como te sugeriram, ler caracter por caracter...

Crias uma flag booleana para saber se estás num comentário ou não.

Se não estiveres num comentário, lês o que está no ficheiro de entrada e escreves para o de saída, excepto se o caracter lido for '/' e o seguinte for '*', caso em que activas a flag e não escreves nada no ficheiro de saida.

Se estiveres num comentário, lês sem escrever até encontrar um '*' seguido de '/', momento em que "desligas" a flag e começas a escrever para o ficheiro de saida.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

Por acaso surgiu-me uma dúvida neste exercício porreiro.

Se leres caracter a caracter, por exemplo, encontras um /* mas tens que ir até ao final para encontrar um */ .

Agora imagem que é um comentário mal feito, inicializado mas não terminado. O que teria de fazer?

Ou seja, quando encontrar um /* vou até á frente até encontrar um */ . Caso encontre volto para trás de novo e então faço o procedimento ???

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

Voltas para trás porquê?

Quando encontras o "/*" deixas de escrever no ficheiro de destino. Quando encontrares um "*/" passas outras vez a escrever no ficheiro de destino. Não precisas nunca de voltar para trás.

(O objectivo deste exercício não me parece que seja andar a ver se o programador tem os comentários bem feitos ou não, acho que podes assumir que estão bem).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

Prossuponho que tenhas que voltar atrás.

Ele diz que quer apagar do ficheiro file.c todos os comentários..

Tu não podes começar a apagar mal encontras um */

Ok, vamos supor que ele não se engana.. mas imagina que é para um professor corrigir os testes de uma turma.

Os alunos são begginers e logo não podemos assumir que estão correctos.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

Não estou a ver qual seria o problema... A partir do momento em que encontras o "/*" apenas deixas de copiar os caracteres para o novo ficheiro (e não apagar caracteres).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Gurzi    2
Gurzi

Acho que não me estou a expressar bem.

Ora bem, visto que o programa funciona mais ou menos através de um charAt() ( não sei o correcto em C ) tu verificas o caracter actual, percebes que é um / asseguir vais procurar o próximo caractér. Se for um * , então estamos perante um comentário.. mas no entanto já avançaste um caracter( neste momento estás no * e antes está o / ) . Logo temos que voltar atrás para apagar caracter a caracter certo ?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nDray    1
nDray

if(caracter[i] == '*' && caracter[i - 1] == '/')
{
    caracter[i - 1] = '\0';
}

terminas a string por aí... E é o que escreves para o novo ficheiro.... Depois vais até ao */, e escreves só o resto da string...

Não é difícil, principalmente se souberes aproveitar o problema... Tipo, para escrever o que estava atrás do início do comentário, bastava

fprintf(ficheiro_de_saida, "%s", caracter[0]);

Como caracter[0] é um pointer, a string vai ser tudo até ao primeiro null, que explicitámos no lugar do /...

Depois no fim do comentário escreves

fprintf(ficheiro_de_saida, "%s", caracter[i]);

em que i é o índice a seguir a "*/"

Isto fica complexo com comentários multi-linha, mas o exercício é simples...

Eu tinha feito isto em java, para uma aula, que suportava também "//", mas esses são os mais fáceis.... :cheesygrin:

E nunca vamos assumir que os comentários estão mal feitos, porque os compiladores não estão para ver se estão a lidar com neewbies ou não.... Podes só ter que verificar se chegaste ao fim do ficheiro sem fechar comentário mas, de resto, não tens de considerar outros erros...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

Acho que não me estou a expressar bem.

Ora bem, visto que o programa funciona mais ou menos através de um charAt() ( não sei o correcto em C ) tu verificas o caracter actual, percebes que é um / asseguir vais procurar o próximo caractér. Se for um * , então estamos perante um comentário.. mas no entanto já avançaste um caracter( neste momento estás no * e antes está o / ) . Logo temos que voltar atrás para apagar caracter a caracter certo ?

Realmente não tinha percebido o que querias dizer...

Mas podes perfeitamente verificar dois caracteres antes de os escrever no novo ficheiro (apesar disto não ser tão simples como parece à primeira vista).

Partilhar esta mensagem


Link 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