Capacidade de armazenar dados de forma que eles sobrevivam ao término da execução de um programa ou sistema.
Fonte da Imagem: CS31. Veja também: Latency by Collin Scott
Uma coleção de dados armazenados em um dispositivo não volátil (HD, SSD).
FILE *
FILE *fp = fopen("dados.txt", "r");
Função fopen(): Abre um arquivo ou cria um novo.
fopen()
Modos de Abertura:
"r"
"w"
"a"
"r+"
"w+"
"a+"
Sempre verifique se o ponteiro é NULL após o fopen. Se for NULL, a abertura falhou (arquivo não encontrado, falta de permissão, etc.).
NULL
fopen
FILE *fp = fopen("dados.txt", "r"); if (fp == NULL) { perror("Erro ao abrir arquivo"); return 1; // Saída segura }
fclose()
O sistema operacional mantém um limite de arquivos abertos.
Exemplo:
FILE *arq = fopen("dados.txt", "w"); if (arq == NULL) { printf("Erro ao abrir o arquivo!\n"); return 1; } // Operações com o arquivo aberto fclose(arq); // Fecha o arquivo para liberar recursos.
Sempre feche os arquivos que abrir. Use fclose() antes de sair do escopo ou ao detectar erro.
#include <stdio.h> #include <stdlib.h> int main() { char caractere; FILE *arq = fopen("meu_texto.txt", "r"); if (arq == NULL) { printf("\nERRO: Não foi possível abrir o arquivo."); printf("\nVerifique se o arquivo existe.\n"); return 1; } // O loop continua enquanto o caractere lido for diferente de EOF. while ((caractere = fgetc(arq)) != EOF) { printf("%c", caractere); // Imprime o caractere na tela } fclose(arq); // Libera o recurso do sistema operacional. return 0; }
#include <stdio.h> int main() { float dose = 1.75; FILE *arquivo = fopen("dose.txt", "w"); if (arquivo == NULL) { printf("Erro ao abrir o arquivo.\n"); return 1; } fprintf(arquivo, "Dose medida: %.2f mSv\n", dose); fclose(arquivo); return 0; }
Considere que o arquivo dose.txt possui apenas o valor 1.75 (escrito anteriormente).
dose.txt
1.75
#include <stdio.h> int main() { float dose; FILE *arquivo = fopen("dose.txt", "r"); if (arquivo == NULL) { printf("Erro ao abrir o arquivo.\n"); return 1; } fscanf(arquivo, "%f", &dose); printf("Dose lida: %.2f mSv\n", dose); fclose(arquivo); return 0; }
Considere que o arquivo dose.txt possui os seguintes valores separados por linha:
1.20 1.40 1.10 1.60 1.30
Podemos iterar pelo arquivo para ler os valores:
#include <stdio.h> int main() { float dose; FILE *arquivo = fopen("doses.txt", "r"); if (arquivo == NULL) { printf("Erro ao abrir o arquivo.\n"); return 1; } while (fscanf(arquivo, "%f", &dose) == 1) { printf("Dose: %.2f mSv\n", dose); } fclose(arquivo); return 0; }
TXT (Text Files):
CSV (Comma Separated Values):
JSON (JavaScript Object Notation):
fputc()
A função fputc() escreve um único caractere em um arquivo.
Sintaxe:
fputc(caractere, arquivo);
FILE *arquivo = fopen("saida.txt", "w"); fputc('A', arquivo); fclose(arquivo);
fputs()
A função fputs() escreve uma string em um arquivo.
fputs(string, arquivo);
FILE *arquivo = fopen("saida.txt", "w"); fputs("Controle de qualidade\n", arquivo); fclose(arquivo);
Observação: fputs() não adiciona \n automaticamente.
\n
fwrite()
A função fwrite() escreve dados em formato binário no arquivo.
fwrite(&variavel, tamanho, quantidade, arquivo);
FILE *arquivo = fopen("dados.bin", "wb"); float dose = 1.75; fwrite(&dose, sizeof(float), 1, arquivo); fclose(arquivo);
Uso típico: Escrever struct e arquivos binários.
struct
Argumentos da função fwrite:
fwrite
&variavel
tamanho
quantidade
arquivo
fprintf()
A função fprintf() escreve dados formatados em um arquivo.
fprintf(arquivo, "formato", valores);
float dose = 1.75; FILE *arquivo = fopen("relatorio.txt", "w"); fprintf(arquivo, "Dose medida: %.2f mSv\n", dose); fclose(arquivo);
Uso típico: Relatórios textuais, escrita com variáveis, saídas organizadas e legíveis.
Manipulação de arquivos é essencial para criar programas que armazenam dados de forma permanente.
Em C, arquivos permitem:
Dúvidas e Discussão
Crie um programa que leia 8 temperaturas de um sensor e grave:
Arquivo de saída: temperaturas.txt.
temperaturas.txt
Crie um programa que cadastre em um arquivo pacientes.txt os dados de 3 pacientes:
pacientes.txt
Cada paciente deve ser salvo em uma linha no arquivo.
Crie uma estrutura Aluno com nome, matricula e nota.
nome
matricula
nota
alunos.txt
Escreva um programa que peça ao usuário o nome de um arquivo .txt. O programa deve abrir esse arquivo, contar quantos caracteres existem nele (incluindo espaços e quebras de linha) e exibir o resultado no console.
.txt
Por que é obrigatório verificar se o ponteiro retornado por fopen() é NULL antes de realizar operações?
Qual a principal diferença entre os modos "w" e "a" na função fopen()?
Em um cenário onde você precisa salvar uma lista de 100 registros de "Produtos" (cada um sendo uma struct), qual método é mais eficiente: gravar cada campo individualmente com fprintf ou usar fwrite para a estrutura completa?
fprintf
Justifique sua resposta.
Resposta esperada: `fwrite` é mais eficiente pois grava o bloco de memória da struct diretamente no disco, evitando a conversão de tipos para texto e múltiplas chamadas de sistema.