Entrada / saída de arquivo C - C file input/output
Biblioteca padrão C |
---|
Tópicos gerais |
Diversos cabeçalhos |
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 | |
|
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
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
- Mídia relacionada à entrada / saída de arquivo C no Wikimedia Commons