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

suzy

ficheiros duvida! urgente

11 mensagens neste tópico

: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);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 "*\".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu acho que ele estava a pensar em "apagar no ficheiro" e não em "não escrever no novo ficheiro"

0

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