Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 50-сабақ (барлығы 55)
Файлды оқу және жазу
50-сабақ. Мәтінді жазып, қайта оқу және енгізу-шығару қатесін түсіндіру.
Мәтін ИИ көмегімен аударылды.
Алдын ала: Result, қатені жеткізу және жолдар. Бұл — уақытша бумадағы бөлек оқу файлы, ұйымдастырғыштың шын дерегі емес.
Таныс бейне және тірек сызба
Дәптерге жазу әрдайым сәтті болмайды: дәптер табылмауы, ашылмауы немесе мәтіннің бұзылуы мүмкін. Енгізу-шығару (I/O) — бағдарламаның сыртқы ортамен, соның ішінде файлмен әрекеті. Result сәттілік пен нақты қатені ажыратады. Ұқсатудың шегі: тексеру мен оқу арасында файл өзгеруі мүмкін, сондықтан жолдың бар болуы кейінгі әрекеттің сәттілігін кепілдемейді.
бөлек уақытша жол таңдау → үстінен жазбай жасау → байттарды жазу → жабу → UTF-8 ретінде оқу → өшіру → қатені өңдеу. temp_dir() жүйенің уақытша бумасын береді; process::id() оқу атауына осы іске қосылған үдерістің нөмірін қосады. create_new(true) жаңа файлды ғана ашады, бар файлдың үстінен жазбайды. write_all — Write трейтінің әдісі, сондықтан оны аламыз; ол мәтіннің барлық байтын жазуға тырысады. as_bytes() UTF-8 мәтінді байт күйінде береді. drop(file) оқу алдында файлды жабады; бұл Windows-та да маңызды. read_to_string бүкіл файлды UTF-8 мәтін ретінде оқиды: файл жоқ болса, рұқсат болмаса не байттар жарамсыз болса, Err қайтарады. ? қатені run қызметінен жоғары жеткізеді, ал std::io::Result<()> сәтті болса қосымша мән жоқ екенін білдіреді. eprintln! қатені әдеттегі нәтижеден бөлек арнаға жазады. ErrorKind қате түрін білдіреді; NotFound файлдың табылмағанын көрсетеді.
std::process::exit(1) өңделмеген қате кезінде бағдарламаны 1 кодымен аяқтайды; 0 коды сәттілік деп қабылданып, шақырған бағдарламаны жаңылыстырар еді.
Оқу жолын сақтап, қайта оқыңыз
Телефонда кодтың ұзын жолын ашық түсті жиектің ішінде саусақпен көлденең жылжытыңыз; бүкіл бет кеңеймейді.
use std::fs::{self, OpenOptions};
use std::io::Write;
fn run() -> std::io::Result<()> {
let path = std::env::temp_dir().join(format!("rust-lesson-50-{}.txt", std::process::id()));
let mut file = OpenOptions::new()
.write(true)
.create_new(true)
.open(&path)?;
file.write_all("Кітап сатып алу\n".as_bytes())?;
drop(file);
let text = fs::read_to_string(&path)?;
print!("{text}");
fs::remove_file(&path)?;
Ok(())
}
fn main() {
if let Err(error) = run() {
eprintln!("Файл қатесі: {error}");
std::process::exit(1);
}
}
Кітап сатып алу
Оқудан кейін remove_file тек осы оқу файлын өшіреді. Оған дейін қате шықса, файл уақытша бумада қалуы мүмкін; қолданба мұны ескеруі тиіс. Сол атау келесі жолы қайталанса, create_new қатемен тоқтап, бұрынғы мазмұнды сақтайды. Бұл ұйымдастырғыштың тұрақты сақталуы емес: сенімді сақтау мен қалпына келтіру келесі сабақтарда қаралады.
Бетке қарамай жауап беріңіз
create_new(true)деректі қалай қорғайды?- Бар файлды оқығанда да
read_to_stringнегеErrқайтара алады? eprintln!қатені қай арнаға жазады?
Тапсырма
Міндетті. Файл өшірілген соң fs::read_to_string(&path) әрекетін тағы орындаңыз. match пен ErrorKind::NotFound арқылы Файл табылмады деп шығарыңыз; күтпеген сәттілік пен өзге қате үшін бөлек тармақ болсын. Нәтижені алдын ала болжаңыз.
Жауаптар
Жауаптарды көрсету
use std::io::{ErrorKind, Write}; қосыңыз. remove_file соңында error.kind() нәтижесін ErrorKind::NotFound мәнімен салыстырыңыз; жүйе хабарламасының мәтінін салыстырмаңыз, ол жүйе тіліне тәуелді.
use std::fs::{self, OpenOptions};
use std::io::{ErrorKind, Write};
fn run() -> std::io::Result<()> {
let path = std::env::temp_dir().join(format!("rust-lesson-50-{}.txt", std::process::id()));
let mut file = OpenOptions::new()
.write(true)
.create_new(true)
.open(&path)?;
file.write_all("Кітап сатып алу\n".as_bytes())?;
drop(file);
let text = fs::read_to_string(&path)?;
print!("{text}");
fs::remove_file(&path)?;
match fs::read_to_string(&path) {
Err(error) if error.kind() == ErrorKind::NotFound => println!("Файл табылмады"),
Ok(_) => println!("Күтпеген сәттілік"),
Err(error) => eprintln!("Файл қатесі: {error}"),
}
Ok(())
}
fn main() {
if let Err(error) = run() {
eprintln!("Файл қатесі: {error}");
std::process::exit(1);
}
}
Кітап сатып алу
Файл табылмады
Тексергеннен кейін
Рұқсат жоқ кезде error.kind() нәтижесі PermissionDenied болуы мүмкін; байттар UTF-8 мәтінін құрмаса, read_to_string да қате қайтарады. Мұндай жағдайды бос тапсырмалар тізімі деп көрсетпеңіз. Шын дерек үшін жазу үзілісінен қорғану және көшірме сақтау қажет; кейінгі сабақтар осыны түсіндіреді. read_to_string жөніндегі ресми құжаттама.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.