Не забудьте сбросить позицию чтения с

аюсь использовать то же самоеstd::fs::File объект для записи и чтения, но чтение возвращает пустую строку.

Я попыталсяflush, sync_all а такжеseek, но ничего не помогло. С новымFile объект я могу легко прочитать файл.

use std::io::{Read, Seek, Write};

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

fn main() {
    // 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"
}
 German Lashevich24 дек. 2017 г., 12:20
Спасибо за уведомление @Stefan! Вы правы, в реальной программе мы должны уважать предупреждения компилятора. Но этот кусок кода был нужен только для того, чтобы ясно показать проблему, не отвлекая деталей.
 Stefan24 дек. 2017 г., 12:15
Вы не обработали / не вошли / не развернули ни одно изResultс, что, вероятно, показало бы проблему. Не игнорируйте предупреждения компилятора!
 Stefan24 дек. 2017 г., 12:29
Если я развернуread_to_string В результате я получаю ошибку «Bad file descriptor», которая говорит мне, что он просто не хочет читать с него, независимо от того,flush, sync_all а такжеseek звонки. Не распутывать ошибки и не задумываться о результате - это «не показывать какие-либо исследовательские усилия» в моих глазах. Так что в реальной программе вы должныручка ошибки, в примерах вы должны по крайней мере развернутьResults.

Ответы на вопрос(1)

Решение Вопроса

Проблема была сFile::create - Этооткрывает файл в режиме только для записи, Исправление заключается в использованииstd::fs::OpenOptions:

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

Не забудьте сбросить позицию чтения сseek.

Ваш ответ на вопрос