<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).

Recebe: um array de caracteres contendo o nome do arquivo e outro com o modo de abertura.

Retorna: o endereço de uma estrutura do tipo FILE usada pelo sistema para gerenciar o arquivo aberto. Em caso de falha, o valor NULL é retornado.

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.

Recebe: uma variável contendo o endereço de um descritor de arquivo.

Retorna: 0 em caso de sucesso, ou EOF em caso de falha.

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).

Recebe: O endereço do buffer (onde a leitura será armazenada), o tamanho em bytes de cada item, a quantidade de itens a serem lidos e o ponteiro para o arquivo.

Retorna: A quantidade de itens (não bytes) lidos com sucesso.

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).

Recebe: O endereço do buffer com os dados a gravar, o tamanho de cada elemento, a quantidade de itens a serem gravados e o ponteiro para o arquivo.

Retorna: A quantidade de itens gravados com sucesso.

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.

Recebe: Um ponteiro para um arquivo aberto, a quantidade (salto em bytes) a deslocar e o ponto de referência (origem: SEEK_SET, SEEK_CUR ou SEEK_END).

Retorna: 0 em caso de sucesso, ou um valor diferente de zero se ocorreu algum erro.

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.

Recebe: O ponteiro para o arquivo alvo.

Retorna: A posição em bytes (a partir do início do arquivo) onde se encontra o cursor atualmente, ou -1L em caso de erro.

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.

Recebe: O ponteiro para o arquivo alvo.

Retorna: Nada (void).

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.

Recebe: O arquivo ou fluxo cujo buffer será forçado a esvaziar.

Retorna: 0 se a operação for bem sucedida, ou EOF se ocorrer falha na gravação.

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).

Recebe: O ponteiro do arquivo alvo, a string de formatação (com tags como %d, %s), e os argumentos variáveis correspondentes.

Retorna: O número total de caracteres gravados no arquivo. Retorna um número negativo em caso de erro.

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.

Recebe: O arquivo alvo, a string de máscara de formatação e os ponteiros das variáveis destino.

Retorna: O número de itens atribuídos com sucesso, ou EOF caso tenha atingido o fim do arquivo ou haja erro na leitura inicial.

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.

Recebe: O arquivo que se deseja avaliar.

Retorna: Um inteiro diferente de zero caso o último comando de leitura do programa tenha atingido o fim do arquivo (caso contrário, 0).

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.

Recebe: Uma string contendo o nome ou diretório do arquivo que se deseja remover.

Retorna: 0 se a operação foi bem-sucedida. Caso contrário, um valor diferente de 0.

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.

Recebe: Uma string com o nome atual do arquivo e outra contendo o novo nome (ou caminho) para ele.

Retorna: 0 se a operação foi bem-sucedida, ou um valor diferente de 0 em caso de erro.

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).

Recebe: A string principal com identificadores de formatação (ex: %d, %s) e as variáveis dinâmicas correspondentes listadas sequencialmente.

Retorna: O número de caracteres total que foram escritos na tela, ou um número negativo em caso de erro.

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).

Recebe: Uma string indicando as máscaras dos dados esperados e os respectivos endereços de memória (ponteiros) onde esses valores serão salvos.

Retorna: A quantidade de itens preenchidos com sucesso, ou EOF se houve falha inicial ou se atingiu o fim das entradas padrão precocemente.

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.

Recebe: O ponteiro para o fluxo alvo a partir da qual o caractere será lido.

Retorna: O valor numérico (ASCII) correspondente ao caractere da stream indicada ou EOF em caso de erro ou fim de leitura.

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).

Recebe: Um ponteiro/array de caracteres onde o texto lido será guardado.

Retorna: A string capturada na chamada da função ou NULL em caso de falha.

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).

Recebe: Nenhum parâmetro (void).

Retorna: O valor do caractere lido (ASCII) ou EOF se não houver dados.

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).

Recebe: O valor do caractere a ser escrito.

Retorna: O próprio caractere que acabou de escrever, ou EOF se acontecer um problema de saída.

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 
;