Arquivo da categoria ‘Dicas e Truques de C e C++’
Simulando o tipo boolean em C
Tipo booleano é muito comum em linguagens modernas como Java (boolean) e C++ (bool) como ele podemos ter variáveis e constantes que possuem apenas os valores
Verdadeiro (1) e Falso (0), entretanto a linguagem de programação C não possui um tipo para representar valores booleanos. Porém, há formas de simular este tipo. Nesta dica estarei mostrando como simular o tipo boolean de uma maneira muito simples e prática.
A Idéia
Para simular o tipo booleano vamos utilizar enumerações e a palavra reservada typedef. Primeiro, criaremos uma enumeração chamada boolean que assuma os valores true e false. Em seguida, utilizaremos o typedef para permitir a declaração de variáveis do tipo enum boolean como se fossem um tipo primitivo qualquer.
O Código
Criando a enumeração:
enum boolean {
true = 1, false = 0
};
Permitindo a sua declaração como um tipo qualquer:
typedef enum boolean bool;
Agora podemos escrever e compilar os códigos como:
bool b = true;
if (b) {
b = false;
}
Imprimindo valores boobleanos como “true” e “false” em C++
Sempre que imprimimos valores boobeanos em C++ eles são impressos como “0″ ou “1″. Por exemplo, seguinte trecho de código:
cout << true << endl;cout << false;
Imprime na tela:
10
Entretando, muitas vezes queremos que a impressão saia assim:
true false
Para que isto o corra só nos basta acrescentar seguinte linha de código, antes de realizar qualquer impressão:
// faz valores booblenos serem impressos como "true" ou "false" cout.setf(ios::boolalpha);
Mais detalhes sobre cout e o método setf acesse: HP C++ User Documentation
A maneira mais fácil de inicializar estruturas
Como você inicializaria os atributos de uma variável do tipo da seguinte estrutura:
struct Ponto {
double x;
double y;
double z;
};
Até bem pouco tempo atrás eu faria assim:
struct Ponto p; p.x = 10.05; p.y = 4.66; p.z = 8.95;
Felizmente existe uma maneira muito mais simples de fazer! Podemos simplesmente inicializar todos os atributos da estrutura na declaração da variável:
struct Ponto p = { 10.05, 4.66, 8.95};
// Equivalente a p.x = 10.05; p.y = 4.66; p.z = 8.95;
Muito mais simples não?
E isto também é valido para estruturas mais complexas:
struct Pessoa {
char *nome;
int celular;
char email[100];
};
// ...
struct Pessoa p = {"Allan Lima", 11223344, "eumesmo@eu.com" };
Observação para programadores C++: Este tipo de inicialização é muito útil principalmente quando estamos sem vontade de implementar um construtor. Além disso, também podemos inicializar classes da mesma forma classe em C++, mas só os atributos públicos são inicializados.
Calculando o tamanho de um arquivo em C
Introdução
O C ANSI não possui uma função para calcular o tamanho de um arquivo, entretanto com combinando duas funções da biblioteca padrão de C podemos fazer isto facilmente, estas funções são:
- fseek - movimenta a posição corrente de escrita ou leitura no arquivo para um local específico
- ftell – retorna a posição corrente de leitura ou escrita no arquivo (em bytes)
A idéia
A idéia é simples, primeiro movimentamos a posição corrente de escrita ou leitura no arquivo para o seu fim, com a função fseek em seguida, chamamos a função ftell para sabermos qual é posição atual de leitura ou escrita no arquivo, neste ponto a função ftell irá retornar quantos bytes o arquivo possui.
Exemplo
Vejamos um exemplo de um programa em que o usuário entra com o nome do arquivo e o programa informa o tamanho do arquivo:
#include <stdio.h>
int main() {
char nomeArquivo[100]; // guarda o nome do arquivo
FILE *arquivo; // ponteiro para o arquivo
long tamanho; // tamanho em bytes do arquivo
printf("Digite o nome do arquivo: ");
scanf("%s", nomeArquivo);
// abre o arquivo para leitura
arquivo = fopen(nomeArquivo, "r");
// verifica se o arquivo foi aberto com sucesso
if (arquivo != NULL) {
// movimenta a posição corrente de leitura no arquivo
// para o seu fim
fseek(arquivo, 0, SEEK_END);
// pega a posição corrente de leitura no arquivo
tamanho = ftell(arquivo);
// imprime o tamanho do arquivo
printf("O arquivo %s possui %ld bytes",
nomeArquivo, tamanho);
} else {
printf("Arquivo inexistente");
}
return 0;
}
Criando uma função que calcular o tamanho de um arquivo
Como a função fseek altera o estado do arquivo, para criarmos uma função que calcular o tamanho de um arquivo devemos guardar o estado do arquivo antes da função ser chamada para, depois poderemos recuperá-lo.
long calcularTamanhoArquivo(FILE *arquivo) {
// guarda o estado ante de chamar a função fseek
long posicaoAtual = ftell(arquivo);
// guarda tamanho do arquivo
long tamanho;
// calcula o tamanho
fseek(arquivo, 0, SEEK_END);
tamanho = ftell(arquivo);
// recupera o estado antigo do arquivo
fseek(arquivo, posicaoAtual, SEEK_SET);
return tamanho;
}
Dúvidas, críticas ou sugestões? Poste um comentário!
Comentários (5)
Deixe um comentário
Comentários (2)