Чтение и запись
Чтение строк из файла
Записывает в файл сообщение из трёх строк, а затем читает его обратно по строчке за раз с помощью итератора Lines
, созданного с помощью BufRead::lines
. File
реализует Read
, который предоставляет типаж BufReader
. Метод File::create
открывает File
для записи, а File::open
для чтения.
use std::fs::File; use std::io::{Write, BufReader, BufRead, Error}; fn main() -> Result<(), Error> { let path = "lines.txt"; let mut output = File::create(path)?; write!(output, "Rust\n💖\nFun")?; let input = File::open(path)?; let buffered = BufReader::new(input); for line in buffered.lines() { println!("{}", line?); } Ok(()) }
Избегайте запись и чтение одного файла
Используйте same_file::Handle
для файла, который можно проверить на равенство с другими дескрипторами. В этом примере дескрипторы файла для чтения и записи проверяются на равенство.
extern crate same_file; use same_file::Handle; use std::fs::File; use std::io::{BufRead, BufReader, Error, ErrorKind}; use std::path::Path; fn main() -> Result<(), Error> { let path_to_read = Path::new("new.txt"); let stdout_handle = Handle::stdout()?; let handle = Handle::from_path(path_to_read)?; if stdout_handle == handle { return Err(Error::new( ErrorKind::Other, "You are reading and writing to the same file", )); } else { let file = File::open(&path_to_read)?; let file = BufReader::new(file); for (num, line) in file.lines().enumerate() { println!("{} : {}", num, line?.to_uppercase()); } } Ok(()) }
cargo run
отображает содержимое файла new.txt.
cargo run >> ./new.txt
ошибки, потому что два файла одинаковы.
Произвольный доступ к файлу с помощью карты памяти
Создаёт карту памяти файла с использованием крейта memmap и моделирует некоторые непоследовательные чтения из файла. Использование карты памяти означает, что вы просто индексируете срезы, а не делаете с помощью seek
навигацию по файлу.
Функция Mmap::map
предполагает, что файл индексированный картой памяти не изменяется одновременно с другим процессом, в противном случае возникает состояние гонки .
extern crate memmap; use memmap::Mmap; use std::fs::File; use std::io::{Write, Error}; fn main() -> Result<(), Error> { write!(File::create("content.txt")?, "My hovercraft is full of eels!")?; let file = File::open("content.txt")?; let map = unsafe { Mmap::map(&file)? }; let random_indexes = [0, 1, 2, 19, 22, 10, 11, 29]; assert_eq!(&map[3..13], b"hovercraft"); let random_bytes: Vec<u8> = random_indexes.iter() .map(|&idx| map[idx]) .collect(); assert_eq!(&random_bytes[..], b"My loaf!"); Ok(()) }