Capítulo 15: Arquivos (Leitura e Escrita) 📝🧟
Neste capítulo, vamos aprender a salvar e ler informações em arquivos de texto externos no Rust, usando o tema The Last of Us!
📖 Por que usar Arquivos?
Até agora, todos os nossos dados sumiam quando o programa fechava. Para salvar o progresso ou manter um diário de sobrevivência no apocalipse, precisamos gravar os dados no disco!
No Rust, as operações com arquivos retornam um Result, pois abrir ou criar um arquivo pode falhar (por exemplo, se o disco estiver cheio ou o arquivo não existir).
📖 Exemplo Guiado: Registro de Sobreviventes
Vamos criar um programa que grava o nome de um sobrevivente em um arquivo chamado diario.txt.
- Crie o arquivo
salvar_sobrevivente.rsna pastasrc/:
use std::fs::File;
use std::io::Write; // Precisamos dessa trait para usar o write!
fn main() -> std::io::Result<()> {
// Tentando criar o arquivo. O '?' no final diz: "Se der erro, retorne o erro imediatamente!"
let mut arquivo = File::create("diario.txt")?;
// Escrevendo no arquivo
arquivo.write_all(b"Registro de Sobrevivente\n")?;
arquivo.write_all(b"Nome: Joel\n")?;
arquivo.write_all(b"Status: Saudavel\n")?;
println!("Dados salvos no diario.txt com sucesso!");
// Retorna Ok vazio se tudo deu certo
Ok(())
}🕹️ Como Executar e Testar no VS Code
- Abra le terminal integrado.
- Compile:
rustc salvar_sobrevivente.rs - Execute:
./salvar_sobrevivente - Abra o arquivo
diario.txtque foi criado na mesma pasta!
📊 Ilustração Visual: Fluxo de Escrita
Veja como o Rust trata a segurança na escrita de arquivos:
graph LR A[Programa] -->|1. File::create| B{Sucesso?} B -->|Sim| C[Escreve os dados] B -->|Não| D[Retorna Erro]
🛠️ Prática Obrigatória 1: Lendo o Arquivo
Pesquise como usar std::fs::read_to_string para ler o conteúdo de um arquivo em uma String. Crie um programa chamado ler_diario.rs que leia o arquivo diario.txt criado anteriormente e exiba o conteúdo no terminal!
🔑 Gabarito de Código
Prática 1: ler_diario.rs
use std::fs;
fn main() -> std::io::Result<()> {
// Lê todo o conteúdo do arquivo para uma String
let conteudo = fs::read_to_string("diario.txt")?;
println!("--- Conteudo do Diario ---");
println!("{}", conteudo);
Ok(())
}