2017-12-23 28 views
0

私は書き込みと読み取りに同じstd::fs::Fileオブジェクトを使用しようとしていますが、読み取りは空の文字列を返します。同じファイルを読み書きに使用できますか?

私はflushsync_allおよびseekにしようとしましたが、何も役に立たなかった。新しいFileオブジェクトでは、ファイルを簡単に読み取ることができます。

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

「結果」のいずれかを処理しなかった/ログ/アンラップしましたが、おそらく問題を示していました。コンパイラの警告を無視しないでください! – Stefan

+0

@Stefanさんへの通知ありがとう!実際のプログラムでは、コンパイラの警告を尊重する必要があります。しかし、このコードは、細部を気にすることなく、問題をはっきりと示すために必要なものでした。 –

+1

'read_to_string'の結果をアンラップした場合、' 'ファイルの記述子が間違っています ''というエラーが表示されます。' 'flush'、' 'sync_all''と' 'seek''呼び出しに関わらず読み込みを望んでいません。エラーを解きほぐさずに結果に疑問を抱かせることは、私の目には「研究努力をしていない」ということです。したがって、実際のプログラムでは、エラーを処理する必要があります。例では、少なくとも結果をアンラップする必要があります。 – Stefan

答えて

2

問題がstd::fs::File::create方法にあった - それopens a file in write-only mode。回避策はstd::fs::OpenOptionsを使用することです。そのような:

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

seekを読んでの位置をリセットすることを忘れないでください。

関連する問題