Entrada / saída de arquivo C - C file input/output

A linguagem de programação C fornece muitas funções de biblioteca padrão para entrada e saída de arquivos . Essas funções constituem a maior parte do cabeçalho da biblioteca padrão C <stdio.h> . A funcionalidade descende de um "pacote de E / S portátil" escrito por Mike Lesk no Bell Labs no início dos anos 1970 e tornou-se oficialmente parte do sistema operacional Unix na versão 7 .

A funcionalidade de E / S de C é de nível bastante baixo para os padrões modernos; C abstrai todas as operações de arquivo em operações em fluxos de bytes , que podem ser "fluxos de entrada" ou "fluxos de saída". Ao contrário de algumas linguagens de programação anteriores, C não tem suporte direto para arquivos de dados de acesso aleatório ; para ler de um registro no meio de um arquivo, o programador deve criar um fluxo, buscar no meio do arquivo e então ler os bytes em sequência do fluxo.

O modelo de fluxo de E / S de arquivo foi popularizado pelo Unix, que foi desenvolvido simultaneamente com a própria linguagem de programação C. A grande maioria dos sistemas operacionais modernos herdou fluxos do Unix, e muitas linguagens na família de linguagens de programação C herdaram a interface de E / S de arquivo do C com poucas ou nenhuma mudança (por exemplo, PHP ).

Visão geral

Esta biblioteca usa os chamados streams para operar com dispositivos físicos como teclados, impressoras, terminais ou qualquer outro tipo de arquivo suportado pelo sistema. Streams são uma abstração para interagir com eles de maneira uniforme. Todos os fluxos têm propriedades semelhantes, independentemente das características individuais dos meios físicos aos quais estão associados.

Funções

A maioria das funções de entrada / saída do arquivo C são definidas em <stdio.h> (ou no cabeçalho C ++ cstdio , que contém a funcionalidade C padrão, mas no namespace std ).


Personagem de byte

Caráter amplo
Descrição
Acesso ao arquivo fopen Abre um arquivo (com um nome de arquivo não Unicode no Windows e possível nome de arquivo UTF-8 no Linux)
freopen Abre um arquivo diferente com um fluxo existente
fflush Sincroniza um fluxo de saída com o arquivo real
fclose Fecha um arquivo
setbuf Define o buffer para um fluxo de arquivo
setvbuf Define o buffer e seu tamanho para um fluxo de arquivo
ampla Alterna um fluxo de arquivo entre E / S de caracteres largos e E / S de caracteres estreitos

Entrada / saída direta
fread Lê de um arquivo
fwrite Grava em um arquivo

Entrada / saída não formatada
fgetc
getc
fgetwc
getwc
Lê um byte / wchar_t de um fluxo de arquivo
fgets fgetws Lê uma linha byte / wchar_t de um fluxo de arquivo
fputc
putc
fputwc
putwc
Grava um byte / wchar_t em um fluxo de arquivo
fputs fputws Grava uma string byte / wchar_t em um fluxo de arquivo
getchar getwchar Lê um byte / wchar_t de stdin
pega N / D Lê uma string de bytes de stdin até que uma nova linha ou final de arquivo seja encontrada (obsoleto em C99, removido de C11)
putchar putwchar Grava um byte / wchar_t para stdout
coloca N / D Grava uma string de byte no stdout
ungetc ungetwc Coloca um byte / wchar_t de volta em um fluxo de arquivo

Entrada / saída formatada
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
Lê a entrada de byte / wchar_t formatada de stdin,
um fluxo de arquivo ou um buffer
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
Lê o byte / wchar_t de entrada formatado de stdin,
um fluxo de arquivo ou um buffer usando a lista de argumentos variáveis
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
Imprime saída formatada de byte / wchar_t para stdout,
um fluxo de arquivo ou um buffer
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Imprime saída formatada de byte / wchar_t para stdout,
um fluxo de arquivo ou um buffer usando lista de argumento variável
perror N / D Grava uma descrição do erro atual em stderr
Posicionamento de arquivo ftell
ftello
Retorna o indicador de posição do arquivo atual
fseek
fseeko
Move o indicador de posição do arquivo para um local específico em um arquivo
fgetpos Obtém o indicador de posição do arquivo
fsetpos Move o indicador de posição do arquivo para um local específico em um arquivo
rebobinar Move o indicador de posição do arquivo para o início de um arquivo

Tratamento de erros
Clearerr Limpa erros
feof Verifica o fim do arquivo
Ferror Verifica se há um erro de arquivo
Operações
em arquivos
retirar Apaga um arquivo
renomear Renomeia um arquivo
tmpfile Retorna um ponteiro para um arquivo temporário
tmpnam Retorna um nome de arquivo único

Constantes

As constantes definidas no cabeçalho <stdio.h> incluem:

Nome Notas
EOF Um número inteiro negativo do tipo int usado para indicar condições de fim de arquivo
BUFSIZ Um número inteiro que é o tamanho do buffer usado pelo () setbuf função
FILENAME_MAX O tamanho de um array char que é grande o suficiente para armazenar o nome de qualquer arquivo que possa ser aberto
FOPEN_MAX O número de arquivos que podem ser abertos simultaneamente; será pelo menos oito
_IOFBF Uma abreviatura para "entrada / saída totalmente armazenada em buffer"; é um número inteiro que pode ser passado para a função setvbuf () para solicitar entrada e saída em buffer de bloco para um fluxo aberto
_IOLBF Uma abreviatura para "entrada / saída de linha em buffer"; é um número inteiro que pode ser passado para a função setvbuf () para solicitar entrada e saída em buffer de linha para um fluxo aberto
_IONBF Uma abreviatura para "entrada / saída não armazenada em buffer"; é um número inteiro que pode ser passado para a função setvbuf () para solicitar entrada e saída sem buffer para um fluxo aberto
L_tmpnam O tamanho de um carvão animal de matriz que é suficientemente grande para armazenar um nome de ficheiro temporário gerado pelo tmpnam () função
NULO Uma macro que se expande para a constante de ponteiro nulo ; ou seja, uma constante que representa um valor de ponteiro que é garantido não ser um endereço válido de um objeto na memória
SEEK_CUR Um número inteiro que pode ser passado para a função fseek () para solicitar o posicionamento em relação à posição atual do arquivo
SEEK_END Um número inteiro que pode ser passado para a função fseek () para solicitar o posicionamento em relação ao final do arquivo
SEEK_SET Um número inteiro que pode ser passado para a função fseek () para solicitar o posicionamento em relação ao início do arquivo
TMP_MAX O número máximo de nomes de arquivos exclusivos geráveis ​​pela função tmpnam () ; será pelo menos 25

Variáveis

Stdstreams-notitle.svg

As variáveis ​​definidas no cabeçalho <stdio.h> incluem:

Nome Notas
Stdin Um ponteiro para um FILE que se refere ao fluxo de entrada padrão, geralmente um teclado.
stdout Um ponteiro para um FILE que se refere ao fluxo de saída padrão, geralmente um terminal de exibição.
stderr Um ponteiro para um FILE que se refere ao fluxo de erro padrão, geralmente um terminal de exibição.

Tipos de membros

Os tipos de dados definidos no cabeçalho <stdio.h> incluem:

  • ARQUIVO - também conhecido comoidentificador de arquivo , este é um tipo opaco que contém as informações sobre um arquivo ou fluxo de texto necessárias para realizar operações de entrada ou saída nele, incluindo:
    • identificador específico da plataforma do dispositivo de E / S associado, como um descritor de arquivo
    • o buffer
    • indicador de orientação do fluxo (não definido, estreito ou largo)
    • indicador de estado de buffer de fluxo (sem buffer, com buffer de linha, totalmente em buffer)
    • Indicador de modo de E / S (fluxo de entrada, fluxo de saída ou fluxo de atualização)
    • indicador de modo binário / texto
    • indicador de fim de arquivo
    • indicador de erro
    • a posição do fluxo atual e o estado de conversão multibyte (um objeto do tipo mbstate_t)
    • bloqueio reentrante (necessário a partir de C11 )
  • fpos_t - um tipo não array capaz de identificar exclusivamente a posição de cada byte em um arquivo e cada estado de conversão que pode ocorrer em todas as codificações de caracteres multibyte compatíveis
  • size_t - um tipo inteiro sem sinal que é o tipo do resultado do operador sizeof .

Extensões

O padrão POSIX define várias extensões para stdio em suas Definições de base, entre as quais estão uma função readline que aloca memória, as funções fileno e fdopen que estabelecem a ligação entre objetos FILE e descritores de arquivo , e um grupo de funções para criar objetos FILE que se referem para buffers na memória.

Exemplo

O programa C a seguir abre um arquivo binário chamado myfile , lê cinco bytes dele e, em seguida, fecha o arquivo.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char buffer[5];
    FILE* fp = fopen("myfile", "rb");

    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }

    for (int i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
        
        buffer[i] = rc;
    }

    fclose(fp);

    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1],
        buffer[2], buffer[3], buffer[4]);

    return EXIT_SUCCESS;
}

Alternativas para stdio

Várias alternativas ao stdio foram desenvolvidas. Entre elas está a biblioteca C ++ iostream , parte do padrão ISO C ++ . ISO C ++ ainda requer a funcionalidade stdio .

Outras alternativas incluem a biblioteca SFIO (A Safe / Fast I / O Library) da AT&T Bell Laboratories . Esta biblioteca, introduzida em 1991, teve como objetivo evitar inconsistências, práticas inseguras e ineficiências no design do stdio . Entre seus recursos está a possibilidade de inserir funções de retorno de chamada em um fluxo para personalizar o tratamento dos dados lidos ou gravados no fluxo. Foi lançado para o mundo exterior em 1997, e o último lançamento foi em 1º de fevereiro de 2005.

Veja também

Referências

links externos