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.