상세 컨텐츠

본문 제목

23. Rust IO

Rust를 처음부터 배우세요

by 러스트코리아 2024. 12. 21. 02:10

본문

반응형

이번 장에서는 Rust에서 중요한 콘텐츠 IO 입출력 에 대해 이야기하겠습니다 . 이것이 Rust 언어가 키보드와 같은 표준 입력으로부터 데이터를 읽고 읽은 데이터를 표시하는 방식입니다.

이 장에서는 Rust 언어 IO 입력 및 출력의 세 가지 주요 부분인 표준 입력에서 데이터 읽기 , 표준 출력에 데이터 쓰기 , 명령줄 매개변수를 간략하게 소개합니다 .

23.1 읽기 및 쓰기 유형

Rust 표준 라이브러리는 두 가지 특성(Trait)을 통해 IO 입력과 출력을 구성합니다.

  • 읽기 특성은 읽는 데 사용됩니다.
  • 쓰기 특성은 쓰기에 사용됩니다.
특성 설명 예시
read 입력 스트림에서 바이트 데이터를 읽는 다양한 방법이 포함되어 있습니다. stdin, file
write 바이트 데이터 및 UTF-8 데이터 형식을 포함하여 출력 스트림에 데이터를 쓰는 다양한 방법이 포함되어 있습니다. stdout, file

23.2 특성/표준 입력 스트림 읽기

Read 특성은 입력 스트림에서 바이트를 읽는 구성요소입니다. 입력 스트림에는 표준 입력, 키보드, 마우스, 명령줄, 파일 등이 포함됩니다.

Read 특성의 read_line() 메서드는 입력 스트림에서 문자열 데이터 한 줄을 읽는 데 사용됩니다. 관련정보는 다음과 같습니다

 

특성 설명
Read read_line(&mut line)->Result 입력 스트림에서 문자열 데이터 라인을 읽고 이를 line 매개변수에 저장합니다.
결과 열거형을 반환하거나, 성공한 경우 읽은 바이트 수를 반환합니다.

23.2.1 예: 명령줄/표준 입력 스트림 stdin()에서 데이터 읽기

Rust 프로그램은 런타임에 사용자 입력 데이터를 받을 수 있습니다.

수신 방법은 표준 입력 스트림(일반적으로 키보드)에서 사용자 입력을 읽는 것입니다.

다음 코드는 표준 입력 스트림/명령줄에서 사용자 입력을 읽고 표시합니다.

  1. fn main(){
  2. let mut line = String::new();
  3. println!("이름을 입력해주세요:");
  4. let b1 = std::io::stdin().read_line(&mut line).unwrap();
  5. println!("안녕하세요 , {}", line);
  6. println!("읽은 바이트 수는 다음과 같습니다.:{}", b1);
  7. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 이름을 입력해주세요:
  2. 처음부터 시작하는 방법에 대한 튜토리얼
  3. 안녕하세요 , 처음부터 시작하는 방법에 대한 튜토리얼
  4.  
  5. 읽은 바이트 수는 다음과 같습니다.56

표준 라이브러리에서 제공하는 std::io::stdin()은 현재 프로세스의 표준 입력 스트림 stdin에 대한 핸들을 반환합니다.

Read_line()은 표준 입력 스트림에서 데이터 한 줄을 읽는 데 사용되는 표준 입력 스트림 stdin의 핸들에 대한 메서드입니다.

read_line() 메서드의 반환 값은 Result 열거형이고 unwrap()은 복구 가능한 오류 처리를 단순화하는 도우미 메서드입니다. Result에 저장된 실제 값을 반환합니다.

참고: read_line() 메서드는 줄 끝의 개행 문자를 자동으로 제거합니다.\n

23.3 쓰기 특성/표준 출력 스트림

Write 특성은 출력 스트림에 바이트를 쓰는 데 사용되는 구성요소입니다. 출력 스트림에는 표준 출력, 명령줄, 파일 등이 포함됩니다.

Write 특성의 write() 메소드는 실제 출력 작업을 완료합니다. 관련정보는 다음과 같습니다

|Trait Trait|Method|Description| 쓰기| write(&buf) -> Result| 매개변수 buf의 바이트 전체 또는 일부를 기본 스트림에 씁니다. 결과 열거형을 반환하거나, 성공한 경우 쓴 바이트 수를 반환합니다. |

참고: write() 메서드는 출력 끝에 개행 문자 \n을 자동으로 추가하지 않습니다. 개행 문자가 필요한 경우 수동으로 추가해야 합니다.

23.3.1 예: stdout()을 사용하여 표준 출력에 쓰기

우리가 이전에 수없이 사용했던 print!() 매크로와 println!() 매크로는 내용을 표준 출력에 쓸 수 있습니다.

하지만 이번에는 다른 작업을 수행합니다. 표준 라이브러리 std::io에서 제공하는 stdout().write() 메서드를 사용하여 콘텐츠를 출력합니다.

  1. use std::io::Write;
  2. fn main() {
  3. let b1 = std::io::stdout().write("처음부터 시작하는 방법에 대한 튜토리얼 ".as_bytes()).unwrap();
  4. let b2 = std::io::stdout().write(String::from("www.naver.com").as_bytes()).unwrap();
  5. std::io::stdout().write(format!("\n바이트 수는 다음과 같습니다.:{}\n",(b1+b2)).as_bytes()).unwrap();
  6. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 처음부터 시작하는 방법에 대한 튜토리얼 www.naver.com
  2. 바이트 수는 다음과 같습니다69

표준 라이브러리에서 제공하는 std::io::stdout()은 현재 프로세스의 표준 출력 스트림 stdout에 대한 핸들을 반환합니다.

Write()는 표준 출력 스트림 stdout의 핸들에 대한 메서드로, 표준 출력 스트림에 바이트 스트림 내용을 쓰는 데 사용됩니다.

write() 메서드의 반환 값은 Result 열거형이고 unwrap()은 복구 가능한 오류 처리를 단순화하는 도우미 메서드입니다. Result에 저장된 실제 값을 반환합니다.

참고: 다음 장에서 파일 관련 IO를 소개하겠습니다.

23.4 명령줄 매개변수

명령줄 매개변수는 프로그램이 실행되기 전에 터미널이나 명령줄 프롬프트 또는 셸을 통해 프로그램에 전달되는 매개변수입니다.

명령줄 인수는 함수에 전달되는 인수와 다소 유사합니다.

예를 들어, 우리가 이전에 수없이 보아왔던 main.exe가 있습니다. 매개변수를 전달하지 않고 실행하기 전에

  1. ./main.exe

그러나 실제로는 프로그램 사용 여부에 관계없이 일부 매개변수를 전달할 수 있습니다. 예를 들어 2019 및 Starting from Zero Egg Tutorial을 매개변수로 전달할 수 있습니다.

./main.exe 2019 처음부터 시작하기 튜토리얼 여러 매개변수를 전달하려면 여러 매개변수를 공백( ' ' )으로 구분해야 합니다. 매개변수에 공백이 있으면 매개변수를 큰따옴표(")로 묶어야 합니다.

  1. ./main.exe 2019 "처음부터 시작하는 방법에 대한 튜토리얼 간단한 프로그래밍"

Rust 언어에는 모든 명령줄 인수를 반환하는 표준 라이브러리에 내장된 std::env::args() 함수가 있습니다.

std::env::args()가 반환한 결과에는 프로그램 이름이 포함됩니다. 예를 들어, 위 명령에서 std::env::args()에 저장된 결과는 다음과 같습니다.

  1. ["./main.exe","2019","처음부터 시작하는 방법에 대한 튜토리얼 간단한 프로그래밍"]

23.4.1 예: 명령줄에 전달된 모든 매개변수 출력

다음 코드에서는 std::env::args()를 반복하여 명령줄에 전달된 모든 인수를 출력합니다.

  1. main.rs
  2. // main.rs
  3. fn main(){
  4. let cmd_line = std::env::args();
  5. println!("총{}개의 명령줄 매개변수가 있습니다",cmd_line.len()); // 전달된 매개변수 수
  6. for arg in cmd_line {
  7. println!("[{}]",arg); // 명령줄에 전달된 매개변수를 반복적으로 출력합니다.
  8. }
  9. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1.  Compiling playground v0.0.1 (/playground)
        Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.47s
         Running `target/debug/playground`
    Standard Output
    총1개의 명령줄 매개변수가 있습니다

Cargo Build 명령을 사용하여 위 프로그램을 컴파일하면 main.exe 또는 main 실행 파일이 생성됩니다.

Rust 언어의 명령줄 매개변수는 다른 언어의 명령줄 매개변수와 동일합니다. 공백( ' ' )은 모든 매개변수를 구분하는 데 사용됩니다. 예를 들어 위에서 전달한 1 Tutorial from Scratch 3 Simple 프로그래밍은 공백을 사용하여 4개의 매개변수["1", "Tutorial from Scratch", "3", "Simple 프로그래밍"]으로 구분됩니다.

그러나 실제로 std::env::args()는 5개의 매개변수를 저장하고 첫 번째 매개변수는 현재 프로그램 이름입니다.

프로그램 이름은 현재 실행 디렉터리와 동일합니다.

23.4.2 예: 명령줄에서 여러 매개변수 읽기

다음 코드는 명령줄에서 공백으로 구분된 여러 매개변수를 읽고 이러한 매개변수의 합계를 계산합니다.

  1. fn main(){
  2. let cmd_line = std::env::args();
  3. println!("총 {}개의 명령줄 매개변수가 있습니다.",cmd_line.len()); // 전달된 매개변수 수
  4.  
  5. let mut sum = 0;
  6. let mut has_read_first_arg = false;
  7.  
  8. //모든 매개변수를 반복하고 그 합계를 계산합니다.
  9.  
  10. for arg in cmd_line {
  11. if has_read_first_arg { // 첫 번째 매개변수는 해당 값이 프로그램 이름이므로 건너뜁니다.
  12. sum += arg.parse::<i32>().unwrap();
  13. }
  14. has_read_first_arg = true; // 다음 매개변수를 계산에 사용할 수 있도록 첫 번째 매개변수를 건너뛰도록 설정합니다. }
  15. println!("합계 값은 다음과 같습니다:{}",sum);
  16. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. $ cargo build
  2. Compiling guess-game-app v0.1.0 (/Users/Admin/Downloads/guess-game-app)
  3. Finished dev [unoptimized + debuginfo] target(s) in 1.59s
  4. $ cargo run 1 2 3 4
  5. Finished dev [unoptimized + debuginfo] target(s) in 0.04s
  6. Running `target/debug/guess-game-app 1 2 3 4`
  7. 총 5개의 명령줄 매개변수가 있습니다.
  8. 합계 값은 다음과 같습니다: 10
현재 콘텐츠 저작권은 chapin666 또는 그 계열사에 있습니다. 
반응형

'Rust를 처음부터 배우세요' 카테고리의 다른 글

25. Rust Cargo 패키지 관리자  (0) 2024.12.22
24. Rust 파일 읽기 및 쓰기  (0) 2024.12.22
22. Rust 제네릭  (0) 2024.12.21
21. Rust 오류 처리  (0) 2024.12.21
20. Rust 컬렉션  (0) 2024.12.14

관련글 더보기