Rust 마이닝 - 파일 읽기/쓰기

4189 단어
주: Rust는 구조가 겹쳐서 읽기가 쉽지 않기 때문에 본고의 해석 부분에서 std 명칭 공간을 생략하지 않습니다.

예제


용도


비헤이비어 단위로 파일 읽기 및 쓰기

코드 및 출력

use std::fs::File;
use std::io;
use std::io::prelude::*;
use std::io::BufReader;

fn main() -> io::Result {
    let path: &str = "lines.txt";

    let mut output: File = File::create(path)?;
    write!(output, "Rust
:)
Fun"); let input: File = File::open(path)?; let buffered: BufReader = BufReader::new(input); for line in buffered.lines().map(|x| x.unwrap()) { // line: String x:Result println!("{}", line); } Ok(()) }

출력
Rust
:)
Fun

이 단락 코드에 존재할 수 있는 의문은

  • 무엇이
  • std::io::prelude
  • std::io::Result
  • std::io::BufReader
  • write!

  • Fileoutputmut 키워드가 필요하지만 input는 필요하지 않습니까?
  • 파일을 수동으로 닫지 않으면 자원 유출이 발생하지 않습니까?


  • 해석하다


    std::io::prelude

    std::io::prelude는 입출력에 유용한trait를 많이 포함하는 모듈입니다.std::prelude와 다르고std::io::preludeuse가 표시되어야 합니다.std::io::prelude는 아래의trait를 내보냅니다
    pub use std::io::Read;
    pub use std::io::Write;
    pub use std::io::BufRead;
    pub use std::io::Seek;
    

    보충, 이 단락과 무관std::prelude은 다음과 같은 내용을 내보냅니다.
    pub use marker::{Copy, Send, Sized, Sync};
    pub use ops::{Drop, Fn, FnMut, FnOnce};
    pub use mem::drop;
    pub use boxed::Box;
    pub use borrow::ToOwned;
    pub use clone::Clone;
    pub use cmp::{PartialEq, PartialOrd, Eq, Ord};
    pub use convert::{AsRef, AsMut, Into, From};
    pub use default::Default;
    pub use iter::{Iterator, Extend, IntoIterator};
    pub use iter::{DoubleEndedIterator, ExactSizeIterator};
    pub use option::Option::{self, Some, None};
    pub use result::Result::{self, Ok, Err};
    pub use slice::SliceConcatExt;
    pub use string::{String, ToString};
    pub use vec::Vec;
    

    std::io::Result

    std::io::Result는 유형 별칭이고 std::io::Result는 유형 별칭이며 입출력을 위해 설계된 std::result::Result입니다.std::io에서 오류가 발생할 수 있는 모든 함수는 이 형식으로 결과를 되돌려줍니다.type Result = Result

    왜 std::result:::Result 대신 사용합니까

    std::io의 함수가 되돌아오는 오류 형식이 std::io::Error라는 매거진에 있기 때문에 항상 써야 하기 때문std::result::Result은 번거롭다.

    네임스페이스 습관

    std::result::Resultstd::prelude에 의해 기본적으로 도출되는 것으로 혼동을 피하기 위해 보통 use std::ioio::Result로 지칭한다std::io::Result.이런 방식을 통해 그것을 std::result::Result와 구분한다.

    입출력에 어떤 오류가 발생합니까?


    자세한 내용은 std::io:::ErrorKind 참조

    또 다른 Result 유형 별칭이 있습니까?


    또 다른 일반적인 Result 유형 별칭은 std::fmt::Result입니다.

    std::io::BufReader


    Read 인스턴스에서 읽기 함수를 직접 호출하면 효율이 낮습니다. 예를 들어 TcpStream에서 읽을 때마다 시스템 호출이 시작됩니다.메모리에 캐시 영역을 만들어서 읽기 효율을 높이려면 BufReader::new 을 사용하면 Read 실현된 실례를 버퍼가 있는 BufReader 로 바꿀 수 있습니다.BufReaderBufRead이trait의 구조를 실현했고 BufReadread_lines 방법을 실현했다.이와 비교하면 std::io::Readbyteschars만 있기 때문에 행위 단위로 파일을 읽을 수 없다.

    write!

    write!宏은 Writetrait의 실체에 포맷된 데이터를 기록하는 데 사용됩니다.impl Write for Vecstd::vec::Vec에 존재하기 때문에 우리는 이 매크로를 이용하여 그 안에 데이터를 쓸 수 있다.주의u8
    use std::io::Write;
    
    fn main() {
      let mut w = Vec::new();
      write!(&mut w, "test").unwrap();
      write!(&mut w, "formatted {}", "arguments").unwrap();
    
      assert_eq!(w, b"testformatted arguments");
    }
    

    왜 File output에는 mut 키워드가 필요하고 input에는 필요하지 않습니까?


    의심스럽지만, 나는 잠시 후에 답을 확정한 후에 여기에 추가할 것이다.

    왜 수동으로 파일을 닫을 필요가 없습니까?

    File 형식은 파일 자원의 소유권을 가지고 있으며, 역할 영역을 떠나면 파일이 자동으로 닫힙니다.

    좋은 웹페이지 즐겨찾기