Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

Dominando I/O de Arquivos em C: Criando, Abrindo e Gerenciando Arquivos

O capítulo anterior explicou os dispositivos de entrada e saída padrão manipulados pela linguagem de programação C. Este capítulo aborda como programadores C podem criar, abrir, fechar arquivos de texto ou binários para armazenamento de dados.

Um arquivo representa uma sequência de bytes, independentemente de ser um arquivo de texto ou binário. A linguagem de programação C fornece acesso a funções de alto nível, bem como chamadas de baixo nível (nível OS) para manipular arquivos em seus dispositivos de armazenamento. Este capítulo o guiará pelas chamadas importantes para gerenciamento de arquivos.

Abrindo Arquivos

Você pode usar a função fopen() para criar um novo arquivo ou abrir um arquivo existente. Esta chamada inicializará um objeto do tipo FILE, que contém todas as informações necessárias para controlar o fluxo. O protótipo desta chamada de função é o seguinte:

FILE *fopen(const char *filename, const char *mode);

Aqui, filename é um literal de string que você usará para nomear seu arquivo, e o mode de acesso pode ter um dos seguintes valores:

NºModo e Descrição
1

r

Abre um arquivo de texto existente para leitura.

2

w

Abre um arquivo de texto para escrita. Se não existir, um novo arquivo é criado. Aqui, seu programa começará a escrever conteúdo do início do arquivo.

3

a

Abre um arquivo de texto para escrita em modo de anexação. Se não existir, um novo arquivo é criado. Aqui, seu programa começará a anexar conteúdo ao conteúdo existente do arquivo.

4

r+

Abre um arquivo de texto para leitura e escrita.

5

w+

Abre um arquivo de texto para leitura e escrita. Primeiro, trunca o arquivo para comprimento zero se existir, caso contrário, cria um arquivo se não existir.

6

a+

Abre um arquivo de texto para leitura e escrita. Cria o arquivo se não existir. A leitura começará do início, mas a escrita só pode ser anexada.

Se você for manipular arquivos binários, usará os seguintes modos de acesso em vez dos mencionados acima:

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Fechando um Arquivo

Para fechar um arquivo, use a função fclose(). O protótipo desta função é:

int fclose(FILE *fp);

A função fclose() retorna zero em caso de sucesso, ou EOF se houver erro ao fechar o arquivo. Esta função na verdade libera quaisquer dados ainda pendentes no buffer para o arquivo, fecha o arquivo e libera qualquer memória usada para o arquivo. O EOF é uma constante definida no arquivo de cabeçalho stdio.h.

Existem várias funções fornecidas pela biblioteca padrão C para ler e escrever um arquivo, caractere por caractere, ou na forma de uma string de comprimento fixo.

Escrevendo em um Arquivo

A seguir está a função mais simples para escrever caracteres individuais em um fluxo:

int fputc(int c, FILE *fp);

A função fputc() escreve o valor do caractere do argumento c no fluxo de saída referenciado por fp. Retorna o caractere escrito em caso de sucesso, caso contrário EOF se houver erro. Você pode usar as seguintes funções para escrever uma string terminada em null em um fluxo:

int fputs(const char *s, FILE *fp);

A função fputs() escreve a string s no fluxo de saída referenciado por fp. Retorna um valor não negativo em caso de sucesso, caso contrário EOF é retornado em caso de erro. Você também pode usar a função int fprintf(FILE *fp, const char *format, ...) para escrever uma string em um arquivo. Tente o seguinte exemplo.

Certifique-se de que o diretório /tmp esteja disponível. Se não estiver, antes de prosseguir, você deve criar este diretório em sua máquina.

#include <stdio.h>
main() {
    FILE *fp;
    fp = fopen("/tmp/test.txt", "w+");
    fprintf(fp, "Isto é teste para fprintf...\n");
    fputs("Isto é teste para fputs...\n", fp);
    fclose(fp);
}

Quando o código acima é compilado e executado, cria um novo arquivo test.txt no diretório /tmp e escreve duas linhas usando duas funções diferentes. Vamos ler este arquivo na próxima seção.

Lendo um Arquivo

Abaixo está a função mais simples para ler um único caractere de um arquivo:

int fgetc(FILE *fp);

A função fgetc() lê um caractere do arquivo de entrada referenciado por fp. O valor de retorno é o caractere lido, ou em caso de erro, retorna EOF. A função a seguir permite ler uma string de um fluxo:

char *fgets(char *buf, int n, FILE *fp);

A função fgets() lê até n-1 caracteres do fluxo de entrada referenciado por fp. Copia a string lida para o buffer buf, anexando um caractere null para terminar a string.

Se esta função encontrar um caractere newline '\n' ou o fim do arquivo EOF antes de ler o número máximo de caracteres, retorna apenas os caracteres lidos até aquele ponto, incluindo o caractere de nova linha. Você também pode usar a função int fscanf(FILE *fp, const char *format, ...) para ler strings de um arquivo, mas ela para de ler após encontrar o primeiro caractere de espaço.

#include <stdio.h>
main() {
    FILE *fp;
    char buff[255];
    fp = fopen("/tmp/test.txt", "r");
    fscanf(fp, "%s", buff);
    printf("1: %s\n", buff);
    fgets(buff, 255, (FILE*)fp);
    printf("2: %s\n", buff);
    fgets(buff, 255, (FILE*)fp);
    printf("3: %s\n", buff);
    fclose(fp);
}

Quando o código acima é compilado e executado, lê o arquivo criado na seção anterior e produz o seguinte resultado:

1: Isto
2: é teste para fprintf...
3: Isto é teste para fputs...

Vamos ver um pouco mais em detalhes o que aconteceu aqui. Primeiro, fscanf() leu apenas Isto porque depois disso encontrou um espaço. A segunda chamada é para fgets() que lê a linha restante até encontrar o fim da linha. Finalmente, a última chamada fgets() lê a segunda linha completamente.

Funções de I/O Binário

Existem duas funções que podem ser usadas para entrada e saída binária:

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

Ambas as funções devem ser usadas para ler ou escrever blocos de memória - geralmente arrays ou estruturas.


Linguagem C

  1. Dominando Entrada e Saída (I/O) em C: scanf() e printf() Explicados
  2. Manipulação de Arquivos em C: Dominando I/O com fopen, fprintf, fread e fseek
  3. Python File I/O: Dominando Operações de Arquivo, Leitura, Escrita e Gerenciamento
  4. Axiomtek IPS960‑511‑PoE: Controlador de Visão Robusto All‑In‑One para Inspeção Industrial
  5. Série acceed EDAM‑4200: Módulos I/O Integrados para Comunicação de Dados Escalável e Confiável
  6. Dominando Funções em C: Estrutura, Declaração e Boas Práticas
  7. Entendendo Arquivos de Cabeçalho em C: Tipos, Uso e Boas Práticas
  8. Placas I/O Explicadas: Como Funcionam e Por Que Importam
  9. Exportação de Dados no MATLAB: Formatos e Técnicas
  10. Dominando I/O de Arquivos em C#: Leitura, Escrita e Gerenciamento de Streams