2017-12-23 7 views
0

Ich versuche, das gleiche std::fs::File Objekt zum Schreiben und Lesen zu verwenden, aber das Lesen gibt eine leere Zeichenfolge zurück.Ist es möglich, dieselbe Datei zum Lesen und Schreiben zu verwenden?

Ich habe versucht, flush, sync_all und seek, aber nichts half. Mit einem neuen File Objekt kann ich die Datei einfach lesen.

const FILE_PATH: &str = "test.txt"; 

// Create file 
let mut f = std::fs::File::create(FILE_PATH).unwrap(); 
f.write_all("foo bar".as_bytes()); 
f.seek(std::io::SeekFrom::Start(0)); 

// Read from the same descriptor 
let mut content = String::new(); 
f.read_to_string(&mut content); 
println!("{:?}", content); // -> "" 

// Read from the other descriptor 
let mut f = std::fs::File::open(FILE_PATH).unwrap(); 
let mut content = String::new(); 
f.read_to_string(&mut content); 
println!("{:?}", content); // -> "foo bar" 
+1

Sie haben nicht mit/log/unwrap eines der '' 'Ergebnisse bearbeitet, was wahrscheinlich das Problem gezeigt hätte. Ignoriere die Compiler-Warnungen nicht! – Stefan

+0

Danke für den Hinweis @Stefan! Sie haben Recht, im realen Programm sollten wir die Warnungen des Compilers beachten. Aber dieses Stück Code wurde nur benötigt, um das Problem klar und ohne störende Details zu zeigen. –

+1

Wenn ich das "read_to_string" -Ergebnis entpacke, bekomme ich einen "Bad file descriptor" -Fehler - was mir sagt, dass es einfach nicht von ihm lesen will, egal was die 'flush',' sync_all' und 'seek' Aufrufe sind. Die Fehler nicht auszupacken und dann über das Ergebnis nachzudenken ist in meinen Augen "keine Forschungsanstrengungen". In einem realen Programm sollten Sie also die Fehler behandeln, in Beispielen sollten Sie zumindest das Ergebnis entpacken. – Stefan

Antwort

2

Das Problem war in std::fs::File::create Methode - es opens a file in write-only mode. Die Problemumgehung besteht darin, std::fs::OpenOptions zu verwenden. Wie folgt aus:

let mut f = OpenOptions::new() 
    .create(true) 
    .write(true) 
    .read(true) 
    .open(FILE_PATH) 
    .unwrap(); 

Vergessen Sie nicht, Position zurückgesetzt mit seek zu lesen.

Verwandte Themen