/*funcao responsavel por carregar imagem
@param	
	ALLEGRO_DISPLAY *janela - janela onde ira desenhar a imagem
	int a - altura da imagem
	itn l - largura da imagem
	int *maxCor -  inteiro que representa tonalidade de cor maxima
	char *tipo - tipo de PGM
	unsigned char ** data - matriz onde sera armazenado os bits
*/
int carregaImagem (ALLEGRO_DISPLAY *janela, int *altura,int *largura, int *maxCor, char *tipo, unsigned char ***data) {
	FILE *arquivo;

	/*ponteiro para o arquivo de imagem no disco*/
	arquivo = abreArquivo("r+b", janela);
	if(arquivo==NULL) return -1;

	/*pega tamanho e tipo da imagem(cabecalho)*/
	if(getCabecalho(arquivo, altura, largura, maxCor, tipo)==-1) {
		return -1;
	}

	if(strcmp(tipo,"P5")!=0) {
		printf("Versao da imagem PGM invalida ou nao suportada!\n");
		return -1;
	}

	/*aloca memoria para a matriz*/
	*data = alocaMatriz(*altura, *largura);

	/*armazena os bits na matriz*/
	if(armazenaDados(arquivo, *data, *altura, *largura, *maxCor)==-1) {
		return -1;
	}

	/*destroy ponteiro*/
	fclose(arquivo);
}
示例#2
0
//funcionalidade 1
void criaArquivoBin(char *nomeArquivo){
	char registro[1000];
	char *paginaCab;
	FILE *arquivoLido, *arquivoBin;
	Cabecalho c;

	//abrindo os arquivos
	arquivoBin = fopen("arquivoTrab1.bin", "wb");
	arquivoLido = fopen(nomeArquivo, "r");
	
	//caso de erro: um dos arquivos nao existe
	if(arquivoLido == NULL || arquivoBin == NULL){
		printf("Falha no carregamento do arquivo.");
		if(arquivoLido != NULL)
			fclose(arquivoLido);
		if(arquivoBin != NULL)
			fclose(arquivoBin);
		return;
	}

	c = inicializaCab();		//inicaliza o registro de cabecalho
	c.status = '0';				//status '0' para indicar que o arquivo binario esta aberto

	//obtencao do registro de cabecalho
	c = getCabecalho(arquivoLido, c);
	c = ajustaCabecalho(c);

	//obtencao da pagina de cabecalho
	paginaCab = getPaginaCab(c);
	fwrite(paginaCab, 32000, 1, arquivoBin);

	//obtencao das demais paginas
	while(!feof(arquivoLido)){
		char *pagina;
		int offset = 0, offsetTamRegistro = 0, tamRegistro = 0, tamRegAnterior = 0;
		fpos_t posAnterior;

		pagina = (char *) malloc(sizeof(char) * 32000);

		while(offset < 32000){
			Dados d;
			d = inicializaRegDados();
			fgetpos(arquivoLido, &posAnterior);
			tamRegAnterior = tamRegistro;
			d = getDados(arquivoLido, d);
			tamRegistro = d.tamanhoRegistro;
			if(d.idServidor == -1){
				/* uma vez que o idServidor nao admite valores invalidos (o que ja eh garantido pelo csv), um valor
				invalido nesse campo (ocorre quando fscanf retorna 0, ver funcao getDados) indica o final do arquivo csv.*/
				fwrite(pagina, offset, 1, arquivoBin);
				offset = 32000;
			}
			else if((d.tamanhoRegistro + 5) <= (32000 - offset)){
				//caso o registro ainda couber na pagina ele sera copiado para a mesma
				pagina = getPaginaDados(d, pagina, &offset, &offsetTamRegistro);
			}
			else{
				/*caso o registro nao couber na pagina, mas o csv ainda nao estiver no final, preenche-se o resto
				da pagina com '@', e retorna-se o ponteiro de posicao do arquivo para a posicao que estava antes
				de ler o registro atual, de forma que ele seja lido novamente e copiado para a proxima pagina.*/
				for(int i = offset; i < 32000; i++){
					pagina[i] = '@';
					tamRegAnterior++;
				}
				memcpy(&pagina[offsetTamRegistro], &tamRegAnterior, 4);
				offset = 32000;
				fwrite(pagina, 32000, 1, arquivoBin);
				fsetpos(arquivoLido, &posAnterior);				
			}
			free(d.nomeServidor);
			free(d.cargoServidor);
		}

		free(pagina);
	}

	free(paginaCab);

	c.status = '1';			//status '1' indica que o arquivo binario foi fechado corretamente
	rewind(arquivoBin);
	fwrite(&c.status, 1, 1, arquivoBin);
	
	//fechando os arquivos
	fclose(arquivoLido);
	fclose(arquivoBin);

	printf("%s", "arquivoTrab1.bin");

}