Bom dia, cara!
Sim. No caso do Dumper, você deve abrir o arquivo em modo Binário utilizando-se dos parâmetros "rb" dentro da função fopen() para que o compilador entenda que o arquivo que está sendo lido ("r" de read) está em modo binário ("b" de binary).
Mas como obviamente estamos trabalhando com dois arquivos (ainda no caso do Dumper), temos também que declarar um segundo arquivo que deverá ser aberto em modo texto para que nele seja armazenado o resultado do Dumper. Porém, em C, quando realizamos a abertura de um arquivo em modo texto, não é necessário especificar o parâmetro "wt" (write text), pois por padrão a linguagem já determina que qualquer abertura de arquivo está em modo texto. Assim sendo, a abertura do arquivo de texto só carrega o parâmetro "w" (write).
Exemplos:
FILE *arquivo_dump;
FILE *arquivo_saida;
arquivo_dump = fopen("Binário_orig.bin", "rb");
arquivo_saida = fopen("Dump.txt", "w");
Agora, no caso do Inserter, temos que nos atentar para algumas coisas antes
declarar a abertura dos arquivos...
Na prática, o Dumper é o programa que lerá o arquivo binário e gravará só seu conteúdo textual dentro de um txt. E o Inserter é o programa que lerá arquivo txt e gravará todo seu conteúdo no arquivo binário.
Tendo isso em mente, sabemos que ao declarar a abertura dos arquivos no Inserter, temos que abrí-los da seguinte forma:
FILE *entrada_txt, *saida_bin;
entrada_txt = fopen("Script.txt", "r");
saida_bin = fopen("rom.bin", "r+b");
Repare que na abertura do arquivo de entrada é especificado só o "r" no segundo parâmetro da função fopen, mostrando que trata-se de uma leitura de um arquivo no modo texto.
Já o arquivo binário recebe o prefixo "r+b" dentro do segundo parâmetro,
mostrando que este arquivo será aberto para "leitura E escrita" em modo
binário.
Mas como são só dois tipos principais de dados que podem ser lidos ou
gravados em tratamento de arquivos em C (Texto ou Binário), o resto é só
entender como funcionam os parâmetros da função fopen().
Vou deixar aqui o código da minha função Dumper com cada linha comentada para ficar mais didático o seu entendimento.
Obs: Ondinha, eu fui procurar saber como poderia desenvolver esse módulo em C
para tratar dos arquivos .tbl que você comentou, e vi que isso na verdade se
trata daquelas famosas "Listas Encadeadas por Ponteiros", né? Se for o mesmo
assunto (que exige um type def struct e tudo mais...) eu ainda não vejo como
poderia implementar isso em um gerenciador de arquivos .tbl... Vou começar a
estudar sobre isso e aí passo aqui no fórum pra comentar...
Até mais!!
Sim. No caso do Dumper, você deve abrir o arquivo em modo Binário utilizando-se dos parâmetros "rb" dentro da função fopen() para que o compilador entenda que o arquivo que está sendo lido ("r" de read) está em modo binário ("b" de binary).
Mas como obviamente estamos trabalhando com dois arquivos (ainda no caso do Dumper), temos também que declarar um segundo arquivo que deverá ser aberto em modo texto para que nele seja armazenado o resultado do Dumper. Porém, em C, quando realizamos a abertura de um arquivo em modo texto, não é necessário especificar o parâmetro "wt" (write text), pois por padrão a linguagem já determina que qualquer abertura de arquivo está em modo texto. Assim sendo, a abertura do arquivo de texto só carrega o parâmetro "w" (write).
Exemplos:
FILE *arquivo_dump;
FILE *arquivo_saida;
arquivo_dump = fopen("Binário_orig.bin", "rb");
arquivo_saida = fopen("Dump.txt", "w");
Agora, no caso do Inserter, temos que nos atentar para algumas coisas antes
declarar a abertura dos arquivos...
Na prática, o Dumper é o programa que lerá o arquivo binário e gravará só seu conteúdo textual dentro de um txt. E o Inserter é o programa que lerá arquivo txt e gravará todo seu conteúdo no arquivo binário.
Tendo isso em mente, sabemos que ao declarar a abertura dos arquivos no Inserter, temos que abrí-los da seguinte forma:
FILE *entrada_txt, *saida_bin;
entrada_txt = fopen("Script.txt", "r");
saida_bin = fopen("rom.bin", "r+b");
Repare que na abertura do arquivo de entrada é especificado só o "r" no segundo parâmetro da função fopen, mostrando que trata-se de uma leitura de um arquivo no modo texto.
Já o arquivo binário recebe o prefixo "r+b" dentro do segundo parâmetro,
mostrando que este arquivo será aberto para "leitura E escrita" em modo
binário.
Mas como são só dois tipos principais de dados que podem ser lidos ou
gravados em tratamento de arquivos em C (Texto ou Binário), o resto é só
entender como funcionam os parâmetros da função fopen().
Vou deixar aqui o código da minha função Dumper com cada linha comentada para ficar mais didático o seu entendimento.
Código Selecionar
void Dumper(char* nome, unsigned int OffsetInicioTexto, unsigned int OffsetFinalTexto){
FILE *arquivo;
FILE *arquivo_saida;
unsigned char *memoria;
int cont = 0;
int l;
unsigned int k=0;
unsigned int n=0;
unsigned int OffsetInicioPonteiros;
unsigned int OffsetFinalPonteiros;
unsigned int h;
unsigned int i, j;
unsigned char tabela[256] = "ABCDEFGHIJKLMNOP"
"QRSTUVWXYZabcdef"
"ghijklmnopqrstuv"
"wxyz0123456789ÂÃ"
"ÄÇÈÉÊËÎÏÔÖÛÜ-ÓÙÚ"
"àáâãçèé%úêõîïôíñ"
"óöûü@.,!?;: @@@'"
"@@@@@@$@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@@"
"@@@@@@@@@@@@@@@*";
//Abre o arquivo de leitura
arquivo = fopen("Crystalis (U) [C][!].gbc", "rb");
//Inicia o ponteiro do arquivo no começo
fseek (arquivo, OFFSET, SEEK_SET);
//Aloca em memória um unsigned char de tamanho 2097152 em decimal
memoria = (unsigned char*) malloc (sizeof(unsigned char)*TAM_ARQ);
//Lê o arquivo de entrada e grava todos os seus bytes na memória, retornando um contador, ou seja, dando um Malloc na bagaça
cont = fread (memoria, sizeof(unsigned char), TAM_ARQ, arquivo);
//Depois que toda a rom estiver na memoria, o arquivo é fechado
fclose(arquivo);
//Abre o arquivo de saída
arquivo_saida = fopen(nome, "wt");
//Inicio do loop que irá percorrer todo o bloco de diálogos a fim de gravar seus dados no arquivo de saída
for(i=OffsetInicioTexto;i<=OffsetFinalTexto;i++){
//Verificação se houve uma quebra de linha
if(memoria[i] == 0xf1){
//Gravação do dado hexadecimal F1 dentro de parênteses no arquivo de saída
fprintf(arquivo_saida, "{%.2x}\n", memoria[i]);
}
//Verificação se houve um fim de diálogo
else if(memoria[i] == 0xf8){
//Gravação do dado hexadecimal F8 dentro de parênteses no arquivo de saída
fprintf(arquivo_saida, "{%.2x}\n------------------\n", memoria[i]);
}
//Se não houver mais nenhum caractere de controle, inserir o caractere coincidindo-o com a tabela de caracteres previamente criada
else{
//Se o caractere lido for igual a @
if(tabela[memoria[i]] != '@'){
//O programa grava o caractere no arquivo de saída coincidindo-o com o valor na tabela
fprintf(arquivo_saida, "%c", tabela[memoria[i]]);
}
}
}
//Fechamento do arquivo de saída
fclose(arquivo_saida);
//Liberação da memória utilizada
free(memoria);
}
Obs: Ondinha, eu fui procurar saber como poderia desenvolver esse módulo em C
para tratar dos arquivos .tbl que você comentou, e vi que isso na verdade se
trata daquelas famosas "Listas Encadeadas por Ponteiros", né? Se for o mesmo
assunto (que exige um type def struct e tudo mais...) eu ainda não vejo como
poderia implementar isso em um gerenciador de arquivos .tbl... Vou começar a
estudar sobre isso e aí passo aqui no fórum pra comentar...
Até mais!!