<stdio.h>
No cabeçalho <stdio.h> (Standard Input/Output) estão localizadas as funções referentes às operações de entrada e saída padrão, bem como manipulação de arquivos. Por meio de suas variáveis, macros e funções, é possível realizar tarefas de leitura e escrita tanto no console (teclado e tela) quanto em arquivos do sistema.
Tipos
- FILE: Estrutura que apresenta os atributos necessários para se operar com arquivos.
- fpos_t: Tipo inteiro positivo destinado a armazenar a posição corrente em um arquivo.
- size_t: Tipo inteiro sem sinal destinado a guardar o tamanho (em bytes) que um objeto ocupa na memória.
Macros
- NULL: Valor que indica que um ponteiro não aponta para um endereço de memória válido (usualmente zero).
- _IOFBF, _IOLBF, _IONBF: Utilizados com a função
setvbuf()para definir o modo de buffer (totalmente em buffer, buffer por linha, sem buffer). - BUFSIZE: Tamanho padrão do buffer utilizado pela função
setbuf(). - EOF: (End Of File) Valor numérico inteiro negativo retornado quando uma função de leitura atinge o fim de um arquivo.
- FOPEN_MAX: Quantidade máxima de arquivos que podem ser abertos simultaneamente durante a execução do programa.
- FILENAME_MAX: Tamanho máximo suportado para uma string que indica o nome de um arquivo.
- L_tmpnam: Tamanho necessário de um array de caracteres para ser usado com a função
tmpnam(). - SEEK_CUR, SEEK_END, SEEK_SET: Utilizados com a função
fseek()para indicar a origem do salto (posição atual, final do arquivo ou início do arquivo, respectivamente). - TMP_MAX: Número máximo de nomes de arquivos temporários únicos que
tmpnam()pode gerar. - stdin, stdout, stderr: Ponteiros do tipo
FILE *que apontam, respectivamente, para a entrada padrão (teclado), saída padrão (tela) e saída de erro padrão.
Funções
FILE *fopen(const char *nomeArquivo, const char *modoDeAbertura)
Abre um arquivo e o associa a uma stream (fluxo de dados).
A função solicita ao sistema operacional o acesso ao arquivo usando os seguintes modos principais:
- r: leitura, posição ajustada para o início.
- r+: leitura e escrita, posição ajustada para o início.
- w: escrita, truncando o arquivo a tamanho zero ou criando um novo.
- w+: leitura e escrita, truncando ou criando um novo arquivo.
- a: escrita (anexar), com posição ajustada para o final. Cria o arquivo se não existir.
- a+: leitura e escrita, posição ajustada para o final. Cria se não existir.
Nota: O modo pode conter o caractere 'b' (ex: "rb", "wb") para indicar modo binário, útil por questões de compatibilidade com o padrão C89, embora muitas vezes ignorado em sistemas POSIX.
Exemplo
// EXEMPLO FOPEN()
#include <stdio.h>
int main(void) {
char *nomeArquivo = "exemplo.dat";
FILE *arquivo = fopen(nomeArquivo, "w");
if (arquivo == NULL) {
printf("Falha ao abrir o arquivo\n");
} else {
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
>ls exemplo.dat main main.c
int fclose(FILE *arquivo)
Fecha a stream e o arquivo associado, liberando recursos do sistema.
A função dispara as ações de fechamento do arquivo, o que inclui gravar qualquer escrita pendente nos buffers. O comportamento é indefinido se o ponteiro passado não for um arquivo aberto ou válido.
Exemplo
// EXEMPLO FCLOSE()
#include <stdio.h>
int main(void) {
char *nomeArquivo = "exemplo.dat";
FILE *arquivo = fopen(nomeArquivo, "w");
fclose(arquivo);
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
>ls exemplo.dat main main.c
size_t fread(void *itemLer, size_t tamanhoDoItem, size_t quantidadeItem, FILE *arquivo)
Lê blocos de dados brutos a partir de um arquivo de entrada (stream).
A quantidade lida pode ser inferior à solicitada se o fim do arquivo for alcançado ou ocorrer um erro. Use as
funções feof e ferror para distinguir entre um
erro e o final do arquivo.
Exemplo
// EXEMPLO FREAD()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "r");
char copia[99];
if (arquivo != NULL) {
int itens_lidos = fread(copia, sizeof(char), 99, arquivo);
printf("Foram lidos %d itens\n", itens_lidos);
for(int i = 0; i < itens_lidos; i++) {
printf("%c", copia[i]);
}
printf("\n");
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
Foram lidos 14 itens
Hello, World!
size_t fwrite(const void *itemEscrita, size_t tamanhoDoItem, size_t quantidadeItem, FILE *arquivo)
Grava blocos de dados em um arquivo de saída (stream).
Exemplo
// EXEMPLO FWRITE()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "w");
char copia[99] = "Hello, World.\n\0";
if(arquivo != NULL) {
fwrite(copia, sizeof(char), 14, arquivo);
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
>cat exemplo.dat
Hello, World.
int fseek(FILE *arquivo, long salto, int origemDoSalto)
Altera a posição do indicador interno de leitura e gravação em um arquivo.
Exemplo
// EXEMPLO FSEEK()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "r");
char copia[99];
if (arquivo != NULL) {
// Move o cursor para o início do arquivo
fseek(arquivo, 0, SEEK_SET);
fread(copia, sizeof(char), 13, arquivo);
copia[13] = '\0';
printf("%s\n", copia);
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
Hello, World.
long int ftell(FILE *arquivo)
Retorna o valor atual do indicador de posição do arquivo.
Exemplo
// EXEMPLO FTELL()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "r");
if (arquivo != NULL) {
printf("%ld\n", ftell(arquivo)); // Posição inicial deve ser 0
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
0
void rewind(FILE *arquivo)
Retorna o indicador de posição do arquivo diretamente para o início do arquivo. É equivalente a fseek(arquivo, 0, SEEK_SET), mas também limpa os sinalizadores de erro.
Exemplo
// EXEMPLO REWIND()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "w+");
char copia[99] = "Hello, World.";
if (arquivo != NULL) {
fwrite(copia, sizeof(char), 13, arquivo);
// Reposiciona o cursor no início
rewind(arquivo);
char teste[99] = {0};
fread(teste, sizeof(char), 13, arquivo);
printf("%s\n", teste);
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
Hello, World.
int fflush(FILE *stream)
Força a gravação imediata de dados que estão pendentes no buffer de saída para o disco físico associado à stream.
Exemplo
// EXEMPLO FFLUSH()
#include <stdio.h>
int main(void) {
char *nomeArquivo = "exemplo.dat";
FILE *arquivo = fopen(nomeArquivo, "w");
char textoQualquer[] = "Teste do teste de testes.\n";
if(arquivo != NULL) {
fwrite(textoQualquer, sizeof(char), sizeof(textoQualquer)-1, arquivo);
fflush(arquivo); // Garante que foi escrito no disco
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
>cat exemplo.dat
Teste do teste de testes.
int fprintf(FILE *stream, const char *formato, ...)
Grava saídas de texto formatadas diretamente em um arquivo (em vez de no terminal).
Exemplo
// EXEMPLO FPRINTF()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "w");
if(arquivo != NULL) {
fprintf(arquivo, "%d é a resposta.\n", 42);
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
>cat exemplo.dat
42 é a resposta.
int fscanf(FILE *stream, const char *formato, ...)
Lê dados formatados de um fluxo de texto (arquivo) e os aloca nas variáveis fornecidas.
Exemplo
// EXEMPLO FSCANF()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "w+");
char palavra[99];
if (arquivo != NULL) {
fprintf(arquivo, "Este não é um teste.\n");
fprintf(arquivo, "Este é O Teste.\n");
rewind(arquivo); // Voltar ao inicio do arquivo
while (fscanf(arquivo, "%s", palavra) != EOF) {
printf("%s ", palavra);
}
putchar('\n');
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
Este não é um teste. Este é O Teste.
int feof(FILE *arquivo)
Testa o indicador de fim de arquivo (End Of File) para um fluxo determinado.
Exemplo
// EXEMPLO FEOF()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "r");
if (arquivo != NULL) {
printf("%d\n", feof(arquivo)); // Ainda não lemos nada, então deve ser 0
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
0
int remove(const char *nomeArquivo)
Exclui um arquivo especificado do sistema de arquivos.
Exemplo
// EXEMPLO REMOVE()
#include <stdio.h>
int main(void) {
remove("exemplo2.dat");
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>ls exemplo2.dat main main.c
>./main
>ls main main.c
int rename(const char *nomeAntigo, const char *nomeNovo)
Renomeia ou move um arquivo no sistema de arquivos.
Exemplo
// EXEMPLO RENAME()
#include <stdio.h>
int main(void) {
rename("exemplo.dat", "exemplo2.dat");
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>ls exemplo.dat main main.c
>./main
>ls exemplo2.dat main main.c
int printf(const char *formato, ...)
A função mais comum para impressão formatada na saída padrão (stdout - tela).
Exemplo
// EXEMPLO PRINTF()
#include <stdio.h>
int main(void) {
printf("%d é a resposta.\n", 42);
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
42 é a resposta.
int scanf(const char *formato, ...)
A função mais utilizada para leitura formatada a partir da entrada padrão (stdin - teclado).
Exemplo
// EXEMPLO SCANF()
#include <stdio.h>
int main(void) {
int numeros[7];
for (int i = 0; i < 7; i++) {
scanf("%d", &numeros[i]);
}
putchar('{');
for (int i = 0; i < 7; i++) {
printf("%d, ", numeros[i]);
}
printf("...}\n");
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
1 2 3 4 5 6 7
{1, 2, 3, 4, 5, 6, 7, ...}
int getc(FILE *stream)
Lê um único caractere a partir do fluxo de entrada fornecido.
Exemplo
// EXEMPLO GETC()
#include <stdio.h>
int main(void) {
FILE *arquivo = fopen("exemplo.dat", "w+");
if (arquivo != NULL) {
fprintf(arquivo, "%d é a resposta.\n", 42);
rewind(arquivo);
char c;
while ((c = getc(arquivo)) != EOF) {
putchar(c);
}
fclose(arquivo);
}
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
42 é a resposta.
char *gets(char *str)
Aviso: Função obsoleta e perigosa (suscetível a buffer overflow). Substituída majoritariamente
por fgets().
Lê uma linha inteira da entrada padrão, extraindo todos os caracteres até encontrar uma quebra de linha (\n).
Exemplo
// EXEMPLO GETS()
#include <stdio.h>
int main(void) {
char texto[99];
// O compilador provavelmente emitirá um alerta contra o uso de gets!
gets(texto);
printf("%s\n", texto);
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
O teste dos testes de casos teste.
O teste dos testes de casos teste.
int getchar()
Lê e retorna o próximo caractere exclusivamente da entrada padrão (stdin - teclado). Funciona de forma similar
a getc(stdin).
Exemplo
// EXEMPLO GETCHAR()
#include <stdio.h>
int main(void) {
char c, frase[99];
int i = 0;
// Interromper a leitura no EOF (teclas Ctrl+D em Linux/Mac, Ctrl+Z em Windows)
while ((c = getchar()) != EOF && i < 98) {
frase[i++] = c;
}
frase[i] = '\0';
printf("%s", frase);
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
O teste do teste de todos os testes Fim.
O teste do teste de todos os testes Fim.
int putchar(int caractere)
Imprime um caractere isolado na saída padrão (stdout - tela).
Exemplo
// EXEMPLO PUTCHAR()
#include <stdio.h>
int main(void) {
putchar(';');
putchar('\n');
return 0;
}
Saída esperada
>clang-7 -pthread -lm -o main main.c
>./main
;