Shanraq.org Shanraq.org
Файлды оқу және жазу
IT

Rust: алғашқы қадамнан жеке жоспарлау құралына дейін 50-сабақ (барлығы 55)

Файлды оқу және жазу

50-сабақ. Мәтінді жазып, қайта оқу және енгізу-шығару қатесін түсіндіру.

Мәтін ИИ көмегімен аударылды.

Алдын ала: Result, қатені жеткізу және жолдар. Бұл — уақытша бумадағы бөлек оқу файлы, ұйымдастырғыштың шын дерегі емес.

Таныс бейне және тірек сызба

Дәптерге жазу әрдайым сәтті болмайды: дәптер табылмауы, ашылмауы немесе мәтіннің бұзылуы мүмкін. Енгізу-шығару (I/O) — бағдарламаның сыртқы ортамен, соның ішінде файлмен әрекеті. Result сәттілік пен нақты қатені ажыратады. Ұқсатудың шегі: тексеру мен оқу арасында файл өзгеруі мүмкін, сондықтан жолдың бар болуы кейінгі әрекеттің сәттілігін кепілдемейді.

бөлек уақытша жол таңдау → үстінен жазбай жасау → байттарды жазу → жабу → UTF-8 ретінде оқу → өшіру → қатені өңдеу. temp_dir() жүйенің уақытша бумасын береді; process::id() оқу атауына осы іске қосылған үдерістің нөмірін қосады. create_new(true) жаңа файлды ғана ашады, бар файлдың үстінен жазбайды. write_allWrite трейтінің әдісі, сондықтан оны аламыз; ол мәтіннің барлық байтын жазуға тырысады. 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 қатемен тоқтап, бұрынғы мазмұнды сақтайды. Бұл ұйымдастырғыштың тұрақты сақталуы емес: сенімді сақтау мен қалпына келтіру келесі сабақтарда қаралады.

Бетке қарамай жауап беріңіз

  1. create_new(true) деректі қалай қорғайды?
  2. Бар файлды оқығанда да read_to_string неге Err қайтара алады?
  3. 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)

Әзірге пікір жоқ. Бірінші болыңыз.