Arquivos


Exemplos de operações de entrada

  • Leitura de um arquivo texto.
  • Leitura de um arquivo binário
  • Leitura de dados recebidos através de uma conexão de rede
  • Leitura de dados recebidos através de uma porta serial

Exemplos de operações de saída

  • Escrita de um arquivo texto
  • Escrita de arquivo binários
  • Envio de dados através de requisições HTTP
  • Envio de dados através de portas seriais

Stream

  • Stream são sequências de bytes
  • No nível mais baixo de abstração, as operações de E/S são feitas em sequências de bytes

Arquivos em C

Para trabalhar com arquivos, a linguagem C oferece o tipo de dado FILE da biblioteca <stdio.h>. Além disso do tipo FILE, há várias funções para manipulações de arquivos, como por exemplo:

  • fopen
  • fclose
  • fprintf
  • fscanf
  • fgets
  • feof

Ao abrir uma arquivo em C com a função fopen, é preciso especificar o modo de acesso (leitura, escrito ou ambos). Então para isso, existem alguns modos de acesso para o conteúdo do arquivo com tal função:

  • r: abre o arquivo para leitura (read). O arquivo deve existir, caso contrário, ocorre uma falha de abertura do arquivo.
  • w: Abre o arquivo para escrita (write). Caso o arquivo já exista, todo o conteúdo é reescrito. Caso contrário, um novo arquivo é criado.
  • a: Abre o arquivo para escrita (append) e adiciona o novo conteúdo ao final do arquivo e mantém o conteúdo anterior do arquivo. Caso o arquivo não exista, um novo arquivo é criado.
  • r+: Abre o arquivo para leitura e escrita (read/update). O arquivo deve existir, caso contrário, ocorre uma falha de abertura do arquivo.
  • w+: Abre o arquivo para leitura e escrita (write/update). Caso o arquivo já exista, o conteúdo existe é reescrito. Caso contrário, um novo arquivo é criado.
  • a+: Abre o arquivo para leitura e escrita (append/update), mas adiciona o novo conteúdo ao final do arquivo e mantém o conteúdo anterior do arquivo. Caso o arquivo não exista, um novo arquivo é criado. Toda inserção move o cursor para o final do arquivo. Alterações da posição do cursor (com fseek()) afeta apenas operações de leitura.
  • b: Indicar que o conteúdo do arquivo deve ser tratado em modo binário.
  • wx: indica escrita exclusiva (write exclusive): se o arquivo a ser aberto já existe, fopen() retorna NULL, evitando que o conteúdo original do arquivo seja apagado. Se não existe, um novo arquivo é criado.
  • w+x: abre um arquivo em modo leitura e escrita exclusiva. Após realizar as operações necessário no arquivo, é importante fechá-lo com a função fclose. Caso não seja feita essa etapa, isso pode ocasionar em problemas, tais como:
  • Recursos criados para gerenciar arquivos não serão liberados;
  • Buffers auxiliares para escrita em disco poderão não ser copiados;
  • Acesso ao arquivo poderá ficar bloqueado, em outras palavras, outros processos não conseguirão acessar o arquivo.

CUIDADO: com early exits (if (erro) return;) no código.

Além dos modos de acesso, é fundamental compreender o funcionamento do posicionamento do cursos dentro do arquivo e para isso é utilizado a função fseek em C que alterar a posição do cursor dentro de um arquivo.

int fseek(FILE *stream, long offset, int whence)

Parâmetros:

  • FILE *stream: Este parâmetro indica o arquivo no qual desejamos modificar a posição do cursor.
  • long offset: Representa o deslocamento de offset posições que desejamos realizar.
  • int whence: Especifica a partir de onde o deslocamento deve ser realizado.
    • SEEK_SET: Significa que o deslocamento deve ser feito a partir do início do arquivo.
    • SEEK_CUR: Indica que o deslocamento será relativo à posição atual do cursor.
    • SEEK_END: Determina que o deslocamento deve partir do final do arquivo.
fseek(arquivo, 0, SEEK_SET);

Isso significa que estamos solicitando a alteração da posição do cursor no arquivo denominado “arquivo”. O deslocamento será de 0 posições a partir do início do arquivo (usando SEEK_SET). Em outras palavras, estamos definindo que a nova posição do cursor dentro do arquivo será no byte zero, correspondendo ao início do arquivo. A função ftell pode ser útil ao trabalhar com o posicionamento do cursor, pois ela retorna a posição atual do cursor. Por exemplo, considere que o cursor está no final do arquivo, logo a função ftell retorna o tamanho do arquivo em bytes, pois cada caractere (incluindo o \n) indica uma posição.

Exemplo: modo leitura

#include <stdio.h>
 
int main() {
    // Declarar um ponteiro para o arquivo
    FILE *arquivo;
 
    // Abrir o arquivo no modo de leitura ('r')
    arquivo = fopen("exemplo.txt", "r");
 
    // Verificar se o arquivo foi aberto com sucesso
    if (arquivo == NULL) {
        printf("Não foi possível abrir o arquivo.\n");
        return 1; // Sair com erro
    }
 
    // Ler o conteúdo do arquivo e fazer algo com ele
    char linha[100];
    while (fgets(linha, sizeof(linha), arquivo) != NULL) {
        printf("%s", linha);
    }
 
    // Fechar o arquivo após a leitura
    fclose(arquivo);
 
    return 0;
}

Saída:

Este é um exemplo de arquivo em C.
Você pode adicionar mais linhas aqui.

Exemplo: modo escrita

#include <stdio.h>
 
int main() {
    // Declarar um ponteiro para o arquivo
    FILE *arquivo;
 
    // Abrir o arquivo no modo de escrita ('w')
    arquivo = fopen("exemplo.txt", "w");
 
    // Verificar se o arquivo foi aberto com sucesso
    if (arquivo == NULL) {
        printf("Não foi possível abrir o arquivo para escrita.\n");
        return 1; // Sair com erro
    }
 
    // Escrever no arquivo
    fprintf(arquivo, "Este é um exemplo de escrita em arquivo em C.\n");
    fprintf(arquivo, "Você pode adicionar mais linhas aqui.\n");
 
    // Fechar o arquivo após a escrita
    fclose(arquivo);
 
    printf("Escrita concluída com sucesso.\n");
 
    return 0;
}

Saída:

Este é um exemplo de escrita em arquivo em C.
Você pode adicionar mais linhas aqui.

Exemplo: modo escrita exclusiva

#include <stdio.h>
 
int main() {
    // Declarar um ponteiro para o arquivo
    FILE *arquivo;
 
    // Abrir o arquivo no modo de escrita exclusiva ('wx')
    arquivo = fopen("exemplo.txt", "wx");
 
    // Verificar se o arquivo foi aberto com sucesso
    if (arquivo == NULL) {
        printf("Não foi possível abrir o arquivo para escrita exclusiva.\n");
        return 1; // Sair com erro
    }
 
    // Escrever no arquivo
    fprintf(arquivo, "Este é um exemplo de escrita em arquivo em C com modo de escrita exclusiva.\n");
    fprintf(arquivo, "Você pode adicionar mais linhas aqui.\n");
 
    // Fechar o arquivo após a escrita
    fclose(arquivo);
 
    printf("Escrita concluída com sucesso.\n");
 
    return 0;
}

Saída:

Este é um exemplo de escrita em arquivo em C com modo de escrita exclusiva.
Você pode adicionar mais linhas aqui.

Exemplo: modo de anexação

#include <stdio.h>
 
int main() {
    // Declarar um ponteiro para o arquivo
    FILE *arquivo;
 
    // Abrir o arquivo no modo de anexação ('a')
    arquivo = fopen("exemplo.txt", "a");
 
    // Verificar se o arquivo foi aberto com sucesso
    if (arquivo == NULL) {
        printf("Não foi possível abrir o arquivo para anexação.\n");
        return 1; // Sair com erro
    }
 
    // Escrever no arquivo
    fprintf(arquivo, "Esta linha será anexada ao arquivo.\n");
    fprintf(arquivo, "Você pode adicionar mais linhas aqui.\n");
 
    // Fechar o arquivo após a anexação
    fclose(arquivo);
 
    // Abrir o arquivo no modo de leitura para exibir seu conteúdo
    arquivo = fopen("exemplo.txt", "r");
 
    // Verificar se o arquivo foi aberto com sucesso
    if (arquivo == NULL) {
        printf("Não foi possível abrir o arquivo para leitura.\n");
        return 1; // Sair com erro
    }
 
    // Exibir o conteúdo do arquivo após a anexação
    printf("Conteúdo do arquivo após a anexação:\n");
    char linha[100];
    while (fgets(linha, sizeof(linha), arquivo) != NULL) {
        printf("%s", linha);
    }
 
    // Fechar o arquivo após a leitura
    fclose(arquivo);
 
    return 0;
}

Saída:

Conteúdo do arquivo após a anexação:

Conteúdo original do arquivo.
Esta linha será anexada ao arquivo.
Você pode adicionar mais linhas aqui.

Referências