Rust 마이닝 - 파일 읽기/쓰기
예제
용도
비헤이비어 단위로 파일 읽기 및 쓰기
코드 및 출력
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
이 단락 코드에 존재할 수 있는 의문은
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!
output
는 mut
키워드가 필요하지만 input
는 필요하지 않습니까?해석하다
std::io::prelude
std::io::prelude
는 입출력에 유용한trait를 많이 포함하는 모듈입니다.std::prelude
와 다르고std::io::prelude
use가 표시되어야 합니다.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::Result
는 std::prelude
에 의해 기본적으로 도출되는 것으로 혼동을 피하기 위해 보통 use std::io
를 io::Result
로 지칭한다std::io::Result
.이런 방식을 통해 그것을 std::result::Result
와 구분한다.
입출력에 어떤 오류가 발생합니까?
자세한 내용은 std::io:::ErrorKind 참조
또 다른 Result 유형 별칭이 있습니까?
또 다른 일반적인 Result 유형 별칭은 std::fmt::Result
입니다.
std::io::BufReader
Read 인스턴스에서 읽기 함수를 직접 호출하면 효율이 낮습니다. 예를 들어 TcpStream에서 읽을 때마다 시스템 호출이 시작됩니다.메모리에 캐시 영역을 만들어서 읽기 효율을 높이려면 BufReader::new
을 사용하면 Read
실현된 실례를 버퍼가 있는 BufReader
로 바꿀 수 있습니다.BufReader
는 BufRead
이trait의 구조를 실현했고 BufRead
는 read_lines
방법을 실현했다.이와 비교하면 std::io::Read
중 bytes
와 chars
만 있기 때문에 행위 단위로 파일을 읽을 수 없다.
write!
write!
宏은 Write
trait의 실체에 포맷된 데이터를 기록하는 데 사용됩니다.impl Write for Vec
가 std::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
형식은 파일 자원의 소유권을 가지고 있으며, 역할 영역을 떠나면 파일이 자동으로 닫힙니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
pub use std::io::Read;
pub use std::io::Write;
pub use std::io::BufRead;
pub use std::io::Seek;
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;
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");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.