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!