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

Francisco

projecto de um movimaker

8 mensagens neste tópico

boas...

ando a fazer o projecto de programação em C para a disciplina de programação, sou aluno do curso de electrotenia do tecnico.

o que se pretencde para a entrega intremédia é a leitura de um ficheiro com a descrição de cenas, e fazer a contabilização das operações efectuadas e a verificação e identificação de possiveis erros. assim por exemplo quando nesse ficheiro aparece a letra N sozinha numa linha significa q é criado um objecto, enfim é dificil explicar assim...

exemplo de uma parte do ficheiro(o P é a geração de um fotograma e o T e o R são de outras operações):

N

A1 4 4

50 50

50 100

100 100

100 50

P

T

A1 100 50

P

R

A1 90

P

R

A1 -45

a minha duvida é qnd eu faço a string comper para verificar a string lida do ficheiro com  por exemplo o caracter "N", meti antes "N\n" para segurar que não existia mais nenhuma letra na linha lida. mas não me verifica isso. alguem sabe porque?

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

int main()
{
char linha[50], l, nome;
int cria=0, trans=0, rot_cg=0, rot_pt=0, redim=0, fot=0, elem=0, comand=0, cria_e, criae=0,trans_e,transe=0,rot_cg_e, rot_cge=0, rot_pt_e, rot_pte=0, redim_e, redime=0, fot_e, fote=0, elem_e, eleme=0, comand_e, espaco_b=0, n_vertices, cor, i, j;
;	int coordenadas_x[20], coordenadas_y[20];

FILE *scene;

scene = fopen("/home/francisco/Desktop/scene.scn", "r"); /*abertura do ficheiro scene em modo de leitura*/

/*verifica se é possível abrir o ficheiro scene correctamente*/
if(scene == NULL)
{
	printf("erro na abertura do ficheiro\n ");
	exit (1); /*termina o programa*/
}

else 
{
	while(fgets(linha,100 ,scene) != NULL)/*lê o ficheiro, linha a linha, enquanto o ficheiro scene nao for todo lido e guarda cada linha lida na string linha[50]*/
	{
		sscanf(linha,"%s",linha);


		if(strcmp(linha, "N") == 0)/*verificação da leitura correcta do comando de criação de um objecto*/
		{

			cria++;		


		}
			if(strcmp("T", linha) == 0)
			{

				trans++;

			}
				if(strcmp("R", linha) == 0)
				{

					rot_cg++;

				}
					if(strcmp("C", linha) == 0)
					{

						rot_pt++;

					}
						if(strcmp("S", linha) == 0)
						{

							redim++;


						}
							if(strcmp("P", linha) == 0)
							{
								fgets(linha, 100,scene);	
								if(strcmp(linha, "\n")==0);		
									fot++;

							}
								if(strcmp("E", linha) == 0)
								{

									elem++;

								}
									if(strcmp(linha, "\n") == 0)		
									{
										espaco_b++;			
									}


	}


	printf("numero de objectos criados: %d\n",cria);
	printf("numero de translacoes: %d\n",trans);	
	printf("numero de rotacoes em relacao ao centro geometrico: %d\n",rot_cg);
	printf("numero de rotacoes em relacao a um ponto: %d\n",rot_pt);
	printf("numero de redimensionamentos: %d\n",redim);
	printf("numero de fotogramas a gerar: %d\n",fot);
	printf("numero de objectos eleminados: %d\n",elem);


}
fclose (scene);

return 0;
}

Nota: estão algumas variáveis a mais porque eu tirei umas linhas de codigo q não influenciam a questão q pus.

se alguem me poder ajudar nesta duvida agradecia imenso!:cheesygrin:

cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpem pensava q tinha colocado no sitio certo.

Ee não me tinha entendido com a especificação de C:P

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a minha duvida é qnd eu faço a string comper para verificar a string lida do ficheiro com  por exemplo o caracter "N", meti antes "N\n" para segurar que não existia mais nenhuma letra na linha lida. mas não me verifica isso. alguem sabe porque?

A função fgets() lê até encontrar um \n (ou chegar ao limite de bytes que tu passas como argumento). Mas o \n fica no final do buffer.

Mas repara que depois de leres uma linha, estás a ler uma string (que vai remover o \n do final) e se fizeres um strcmp() com o \n nunca vai funcionar.

Penso que era esta a tua dúvida, senão explica melhor o problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmmmm ...

eu não gosto desta instrução

sscanf(linha, "%s", linha);

porque estás a alterar a mesma variável que estás a ler (no teste que fiz funcionou como seria de esperar, mas eu usaria sempre variáveis diferentes para as duas partes do sscanf).

Declaraste linha como char[50], mas estás a querer meter lá 100 caracteres. Não faças isso!

char linha[50];
/* ... */
fgets(linha, 100, scene);

E só mais uma coisa: NUNCA uses scanf (e fscanf ou sscanf) sem verificar o valor de retorna da função. As funções scanf devolvem o número de variáveis que alteraram (que pode ser 0) ou EOF se houver erro. Se, por acaso, o programa falhar em alterar as variáveis, como não testas o resultado do scanf nunca vais saber o que está mal.

if (sscanf(linha, "%s", linha) != 1) /* possível erro */;

Para responder à tua dúvida específica: o strcmp devia funcionar como o escreveste. Se não está a funcionar é porque o "problema" está noutra parte do programa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado Triton e pmg pela ajuda!

Sim Triton  essa era uma duvida... Já sei que não posso utilizar então o \n para fazer o ue eu pretendo.

o erro na dimensão da linha, pmg, não tinha reparado na altura mas emendei logo, isso aconteceu porque eu alterei a dimensão da string e esqueci-me de alterar na declaração da string linha... esse troço de codigo é uma boa ideia para eu acrescentar para ver se a string foi ebm lida e guardada. é verdade que o codigo funciona assim, mas o que eu queria era fazer essa ctring comper a verificar se só existia mesmo só um caracter na linha e que pode ser N, T, P, R... ou seja que fazia logo um paragrafo asseguir. tentei o "N\0" e isto tb para os Ps os Ts e não fazia essa verificação, é precisamente essa a minha dúvida. sabem como resolvo isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois. isso já tinha experimentado e não me funciona, é mesmo estranho. Fiz isso assim:

if((strcmp("T", linha) == 0) && (strlen(linha) == 1))

fui ao ficheiro e meti lá letras na mesma linha onde está umdo T(por exemplo)  e continuou a verificar o que está dentro do if.

e se desse até punha a strcountd para ver se também não existiam numeros.

não sei mesmo porque.

mais ideias? :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Em vez do strcmp() compara os caracteres directamente.

/* if (strcmp("T", linha) == 0) */
if (('\0' != linha[0]) && ('T' == linha[0]) && ('\0' == linha[1]))

Edit: condição desnecessária

/* if (strcmp("T", linha) == 0) */
if (('T' == linha[0]) && ('\0' == linha[1]))

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