Dengan Rust yang relatif baru, saya telah melihat terlalu banyak cara membaca dan menulis file. Banyak cuplikan sangat berantakan yang dibuat seseorang untuk blog mereka, dan 99% contoh yang saya temukan (bahkan di Stack Overflow) berasal dari bangunan tidak stabil yang tidak lagi berfungsi. Sekarang Rust stabil, apa itu potongan sederhana, mudah dibaca, tidak panik untuk membaca atau menulis file?
Ini adalah hal terdekat yang saya dapatkan dengan sesuatu yang berfungsi dalam hal membaca file teks, tetapi masih belum kompilasi meskipun saya cukup yakin saya sudah memasukkan semua yang harus saya miliki. Ini didasarkan dari cuplikan yang saya temukan di Google+ dari semua tempat, dan satu-satunya hal yang saya ubah adalah bahwa yang lama BufferedReader
sekarang hanya BufReader
:
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
fn main() {
let path = Path::new("./textfile");
let mut file = BufReader::new(File::open(&path));
for line in file.lines() {
println!("{}", line);
}
}
Kompiler mengeluh:
error: the trait bound `std::result::Result<std::fs::File, std::io::Error>: std::io::Read` is not satisfied [--explain E0277]
--> src/main.rs:7:20
|>
7 |> let mut file = BufReader::new(File::open(&path));
|> ^^^^^^^^^^^^^^
note: required by `std::io::BufReader::new`
error: no method named `lines` found for type `std::io::BufReader<std::result::Result<std::fs::File, std::io::Error>>` in the current scope
--> src/main.rs:8:22
|>
8 |> for line in file.lines() {
|> ^^^^^
Singkatnya, yang saya cari adalah:
- keringkasan
- keterbacaan
- mencakup semua kemungkinan kesalahan
- tidak panik
std::io::Read
), perhatikan bahwa di Rust Anda harus mengimpor sifat-sifat yang Anda harapkan akan digunakan secara eksplisit ; jadi di sini Anda kehilangan sebuahuse std::io::Read
(yang bisa menjadiuse std::io::{Read,BufReader}
untuk menyatukan kedua kegunaan bersama)Jawaban:
Tidak ada fungsi yang saya tunjukkan di sini panik sendiri, tetapi saya menggunakan
expect
karena saya tidak tahu jenis penanganan kesalahan apa yang paling cocok dengan aplikasi Anda. Go membaca The Rust Bahasa Pemrograman 's bab tentang kesalahan penanganan untuk memahami cara tepat menangani kegagalan dalam program Anda sendiri.Karat 1,26 dan seterusnya
Jika Anda tidak ingin peduli dengan detail yang mendasarinya, ada fungsi satu baris untuk membaca dan menulis.
Baca file ke
String
Baca file sebagai
Vec<u8>
Tulis file
Karat 1.0 dan seterusnya
Bentuk-bentuk ini sedikit lebih verbose daripada fungsi satu-baris yang mengalokasikan
String
atauVec
untuk Anda, tetapi lebih kuat karena Anda dapat menggunakan kembali data yang dialokasikan atau menambahkan ke objek yang ada.Membaca data
Membaca file memerlukan dua bagian inti:
File
danRead
.Baca file ke
String
Baca file sebagai
Vec<u8>
Tulis file
Menulis file mirip, kecuali kami menggunakan
Write
sifat dan kami selalu menulis byte. Anda dapat mengonversi aString
/&str
menjadi byte denganas_bytes
:Buffered I / O
Pembaca yang dilindungi (atau penulis) menggunakan buffer untuk mengurangi jumlah permintaan I / O. Sebagai contoh, itu jauh lebih efisien untuk mengakses disk sekali untuk membaca 256 byte daripada mengakses disk 256 kali.
Yang sedang berkata, saya tidak percaya pembaca / penulis buffer akan berguna saat membaca seluruh file.
read_to_end
tampaknya menyalin data dalam potongan yang agak besar, sehingga transfer mungkin sudah secara alami digabungkan menjadi lebih sedikit permintaan I / O.Berikut adalah contoh menggunakannya untuk membaca:
Dan untuk menulis:
A
BufReader
lebih berguna ketika Anda ingin membaca baris demi baris:sumber
b"foobar"
adalah literal untuk membuat referensi ke array byte (&[u8; N]
). Dengan demikian, itu tidak berubah. Tidak ada yang memberi Anda bahwa Anda tidak dapat melakukan dengan cara yang lebih sederhana.Vec<u8>
untuk membaca dan menulis. Itu adalah byte mentah.