Da Rust vergleichsweise neu ist, habe ich viel zu viele Möglichkeiten zum Lesen und Schreiben von Dateien gesehen. Viele sind extrem chaotische Schnipsel, die sich jemand für sein Blog ausgedacht hat, und 99% der Beispiele, die ich gefunden habe (sogar bei Stack Overflow), stammen von instabilen Builds, die nicht mehr funktionieren. Was ist nun, da Rust stabil ist, ein einfaches, lesbares, nicht in Panik geratenes Snippet zum Lesen oder Schreiben von Dateien?
Dies ist das Beste, was ich beim Lesen einer Textdatei erreicht habe, aber es wird immer noch nicht kompiliert, obwohl ich ziemlich sicher bin, dass ich alles aufgenommen habe, was ich haben sollte. Dies basiert auf einem Ausschnitt, den ich ausgerechnet auf Google+ gefunden habe, und das einzige, was ich geändert habe, ist, dass der alte BufferedReader
jetzt nur noch ist 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);
}
}
Der Compiler beschwert sich:
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() {
|> ^^^^^
Um es zusammenzufassen, was ich suche, ist:
- Kürze
- Lesbarkeit
- deckt alle möglichen Fehler ab
- keine Panik
std::io::Read
Beachten Sie in Bezug auf den Merkmalsfehler ( ), dass Sie in Rust die Merkmale importieren müssen, die Sie voraussichtlich explizit verwenden werden . daher fehlt hier einuse std::io::Read
(was ein sein könnte,use std::io::{Read,BufReader}
um die beiden Verwendungen zusammen zu verschmelzen)Antworten:
Keine der Funktionen, die ich hier zeige, gerät in Panik, aber ich verwende sie,
expect
weil ich nicht weiß, welche Art der Fehlerbehandlung am besten in Ihre Anwendung passt. Zum Lesen der Rost Programmiersprache ‚s Kapitel über die Fehlerbehandlung zu verstehen , wie in geeigneter Weise Fehler in Ihrem eigenen Programm zu handhaben .Rost ab 1,26
Wenn Sie sich nicht um die zugrunde liegenden Details kümmern möchten, gibt es einzeilige Funktionen zum Lesen und Schreiben.
Lesen Sie eine Datei zu einem
String
Lesen Sie eine Datei als
Vec<u8>
Schreiben Sie eine Datei
Rost 1.0 und höher
Diese Formulare sind etwas ausführlicher als die einzeiligen Funktionen, die ein
String
oderVec
für Sie zuweisen , sind jedoch insofern leistungsfähiger, als Sie zugewiesene Daten wiederverwenden oder an ein vorhandenes Objekt anhängen können.Daten lesen
Das Lesen einer Datei erfordert zwei Kernelemente:
File
undRead
.Lesen Sie eine Datei zu einem
String
Lesen Sie eine Datei als
Vec<u8>
Schreiben Sie eine Datei
Das Schreiben einer Datei ist ähnlich, außer dass wir das
Write
Merkmal verwenden und immer Bytes ausschreiben. Sie können einString
/&str
in Bytes konvertieren mitas_bytes
:Gepufferte E / A.
Ein gepufferter Leser (oder Schreiber) verwendet einen Puffer, um die Anzahl der E / A-Anforderungen zu verringern. Zum Beispiel ist es viel effizienter, einmal auf die Festplatte zuzugreifen, um 256 Bytes zu lesen, anstatt 256 Mal auf die Festplatte zuzugreifen.
Abgesehen davon glaube ich nicht, dass ein gepufferter Leser / Schreiber beim Lesen der gesamten Datei nützlich sein wird.
read_to_end
scheint Daten in etwas großen Blöcken zu kopieren, so dass die Übertragung möglicherweise bereits zu weniger E / A-Anforderungen zusammengeführt wird.Hier ist ein Beispiel für die Verwendung zum Lesen:
Und zum Schreiben:
A
BufReader
ist nützlicher, wenn Sie Zeile für Zeile lesen möchten:quelle
b"foobar"
ist ein Literal zum Erstellen eines Verweises auf ein Array von Bytes (&[u8; N]
). Als solches ist es unveränderlich. Es gibt nichts, was Sie nicht einfacher machen können.Vec<u8>
zum Lesen und Schreiben verwendet. Das sind rohe Bytes.