ficheiros duvida! urgente - C - Portugal-a-Programar
ficheiros duvida! urgente
Por suzy, 4 de Setembro de 2007 em C
malta! ajuda, tou agora a começar em ficheiros e isto ta mto complicado
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
eu ainda tentei, mas deve tar tudo errado, como faziam???
s	 FILE *original,*novo;
printf(" nao e possivel fazer o programa %s\n", argv[0];
original=fopen(argv[1],"r");
if(original==null)
printf(" nao posso abrir o ficheiro\n");
novo=fopen(argv[2],"w");
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);
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 "*\".
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.
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 ???
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).
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.
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).
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 ?
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....
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...
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).