Arquivos de texto

✍️ Escrita

Para a escrita de arquivos de texto, podemos utilizar duas funções: fputs e fprintf.

fputs

A função fputs é usada para escrever uma string em um arquivo. Um detalhe importante sobre o seu funcionamento é que ela não adiciona automaticamente uma nova linha no final da string escrita. Confira a sua assinatura:

int fputs(const char *conteudo, FILE *arquivo);
  • const char *conteudo: Ponteiro para a string que será escrita no arquivo.
  • FILE *stream: Ponteiro para o arquivo onde a string será escrita.

Se executada com sucesso, a função retorna um valor não negativo. Caso contrário, retorna a constante EOF (equivalente a -1).

Veja um exemplo completo do uso de fputs:

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

int main() {
    FILE *arquivo = fopen("arquivo.txt", "w");
    if (!arquivo) {
        printf("Erro ao abrir arquivo para escrita.\n");
        return 1;
    }

    // Escrevendo no arquivo com fputs
    fputs("Olá, mundo!", arquivo);
    fputs("\nEsta é uma nova linha.\n", arquivo);

    fclose(arquivo);
    return 0;
}

fprintf

Outra possibilidade para escrita em arquivos consiste na função fprintf, uma versão da conhecida printf, porém para arquivos. Com essa função, podemos aplicar formatação aos dados, assim como fazemos na impressão em tela.

Veja o protótipo da função:

int fprintf(FILE *arquivo, const char *formato, ...);
  • FILE *arquivo: Ponteiro para o arquivo onde a saída formatada será escrita.
  • const char *formato: String de formato que especifica como os dados subsequentes são formatados para saída.
  • ...: Uma lista variável de argumentos que representa os dados a serem formatados e escritos.

Essa função retorna o número total de caracteres escritos (excluindo o caractere nulo final). Em caso de erro, retorna um número negativo.

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

int main() {
    FILE *arquivo = fopen("arquivo.txt", "w");
    if (!arquivo) {
        printf("Erro ao abrir arquivo para escrita.\n");
        return 1;
    }

    char texto[] = "Idade";
    int idade = 25;
    fprintf(arquivo, "%s: %d\n", texto, idade);

    fclose(arquivo);
    return 0;
}

👀 Leitura

Para a leitura de arquivos de texto, podemos utilizar as funções fgets e fscanf.

fgets

A função fgets é usada para ler uma string de um arquivo, sendo especialmente útil para ler linhas de texto. Um aspecto importante dessa função é que ela lê até uma quebra de linha, um número especificado de caracteres, ou o final do arquivo (EOF), o que ocorrer primeiro. A assinatura de fgets é:

char *fgets(char *conteudo, int n, FILE *arquivo);
  • char *conteudo: Ponteiro para o array onde a string lida será armazenada.
  • int n: Número máximo de caracteres a serem lidos (incluindo o caractere nulo final).
  • FILE *arquivo: Ponteiro para o arquivo de onde a string será lida.

Se executada com sucesso, fgets retorna o ponteiro conteudo. Em caso de erro ou se EOF (fim do arquivo, end of file) é alcançado antes de qualquer caracter ser lido, retorna NULL.

Veja um exemplo do uso de fgets:

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

int main() {
    FILE *arquivo = fopen("arquivo.txt", "r");
    if (!arquivo) {
        printf("Erro ao abrir arquivo para leitura.\n");
        return 1;
    }

    char conteudo[100];

    // Lendo do arquivo com fgets
    while (fgets(conteudo, 100, arquivo) != NULL) {
        printf("%s", conteudo);
    }

    fclose(arquivo);
    return 0;
}

Se desejarmos ler um inteiro, com a necessidade de conversão, o procedimento seria:

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

int main() {
    FILE *arquivo = fopen("numero.txt", "r");
    if (!arquivo) {
        printf("Erro ao abrir o arquivo.\n");
        return 1;
    }

    char conteudo[100];
    int numero;

    // Usando fgets para ler a linha
    if (fgets(conteudo, 100, arquivo) != NULL) {
        // Convertendo a string lida para inteiro
        sscanf(conteudo, "%d", &numero);
        printf("Número lido: %d\n", numero);
    } else {
        printf("Erro ao ler do arquivo.\n");
    }

    fclose(arquivo);
    return 0;
}

fscanf

A função fscanf é utilizada para ler e interpretar dados formatados de um arquivo. Essencial em situações onde você precisa extrair dados formatados, como números, caracteres ou strings, de um arquivo de texto.

Sua funcionalidade é semelhante à do fscanf, mas ao invés de ler do stdin, lê de um arquivo especificado. A assinatura da função fscanf é:

int fscanf(FILE *arquivo, const char *formato, ...);
  • FILE *arquivo: Ponteiro para o arquivo de onde os dados serão lidos.
  • const char *format: String de formato que especifica como os dados lidos devem ser interpretados. Esta string pode conter especificadores de formato, caracteres de espaço em branco e caracteres literais.
  • ...: Argumentos adicionais que são ponteiros para variáveis onde os dados lidos e interpretados serão armazenados.

O retorno de fscanf é o número de campos de entrada lidos e convertidos com sucesso. Em caso de falha, retorna EOF.

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

int main() {
    FILE *arquivo = fopen("dados.txt", "r");
    if (!arquivo) {
        printf("Erro ao abrir o arquivo para leitura.\n");
        return 1;
    }
    
    char nome[50];
    int idade;

    // Lendo dados formatados do arquivo com fscanf
    while (fscanf(arquivo, "%49s %d", nome, &idade) != EOF) {
        printf("Nome: %s, Idade: %d\n", nome, idade);
    }

    fclose(arquivo);
    return 0;
}

Neste exemplo, fscanf é usada para ler um nome (string) e uma idade (inteiro) de cada linha do arquivo dados.txt. Os especificadores de formato %49s e %d são usados para ler uma string e um inteiro, respectivamente, e cada par de nome e idade lido é impresso na tela. Note que %49s limita a leitura da string a 49 caracteres, para evitar overflow no buffer nome.