Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
File::open() / File::create()
Rustでファイルハンドルを使って読み書きするには『File::open()』や『File::create()』でファイルを開き、『BufReader』『BufWriter』でバッファリングしながら行単位の処理を行います。
構文
use std::fs::File;
use std::io::{BufRead, BufReader, BufWriter, Write};
// 読み取り用にファイルを開きます。
let file = File::open("input.txt")?;
let reader = BufReader::new(file);
// 行ごとに読み込みます。
for line in reader.lines() {
let line = line?;
println!("{}", line);
}
// 書き込み用にファイルを作成します(上書き)。
let file = File::create("output.txt")?;
let mut writer = BufWriter::new(file);
writeln!(writer, "Hello, Rust!")?;
writer.flush()?;
// 追記モードでファイルを開きます。
use std::fs::OpenOptions;
let file = OpenOptions::new().append(true).open("log.txt")?;
型・メソッド一覧
| 型・メソッド | 概要 |
|---|---|
| File::open(path) | 読み取り専用でファイルを開きます。Result<File> を返します。 |
| File::create(path) | 書き込み用にファイルを作成します(既存ファイルは上書き)。Result<File> を返します。 |
| BufReader::new(file) | ファイルをバッファリングして読み取り効率を上げます。 |
| BufWriter::new(file) | ファイルをバッファリングして書き込み効率を上げます。 |
| reader.lines() | 行ごとのイテレータを返します(改行文字を除きます)。 |
| reader.read_line(&mut s) | 1行を文字列に読み込みます。読み込んだバイト数を返します。 |
| writeln!(writer, ...) | 改行付きでバッファに書き込みます。 |
| writer.flush() | バッファの内容をファイルに書き出します。 |
| OpenOptions::new() | 細かいオープンモードを指定します(read/write/append/create/truncate)。 |
サンプルコード
use std::fs::{self, File, OpenOptions};
use std::io::{self, BufRead, BufReader, BufWriter, Write};
fn main() -> io::Result<()> {
// テスト用ファイルを作成します。
fs::write("sample.txt", "Apple\nBanana\nCherry\nDate\n")?;
// --- BufReader で行ごとに読み込みます ---
let file = File::open("sample.txt")?;
let reader = BufReader::new(file);
println!("=== 行ごとの読み込み ===");
for (i, line) in reader.lines().enumerate() {
let line = line?;
println!("行{}: {}", i + 1, line);
}
// --- BufWriter で書き込みます ---
let file = File::create("output.txt")?;
let mut writer = BufWriter::new(file);
writeln!(writer, "1行目")?;
writeln!(writer, "2行目")?;
write!(writer, "3行目(改行なし)")?;
writer.flush()?; // バッファを強制書き出しします。
println!("\noutput.txt に書き込みました");
// --- OpenOptions で追記モード ---
let file = OpenOptions::new()
.append(true) // 追記モード
.open("output.txt")?;
let mut writer = BufWriter::new(file);
writeln!(writer, "\n4行目(追記)")?;
writer.flush()?;
println!("追記しました");
// --- read_line で1行ずつ処理します ---
let file = File::open("output.txt")?;
let mut reader = BufReader::new(file);
let mut line = String::new();
let bytes = reader.read_line(&mut line)?;
println!("\n最初の行: {:?}({}バイト)", line.trim(), bytes);
// 後片付け
fs::remove_file("sample.txt")?;
fs::remove_file("output.txt")?;
Ok(())
}
概要
大きなファイルを処理する場合は『BufReader』でバッファリングすることで I/O の呼び出し回数を減らし、パフォーマンスを向上させます。行ごとに処理する場合は『reader.lines()』イテレータが最も使いやすい方法です。
書き込み後は必ず『writer.flush()』を呼んでバッファの内容をファイルに反映させてください。『BufWriter』がスコープを抜けると自動的に flush されますが、エラーは無視されるため明示的に呼ぶことを推奨します。
ファイル全体を一度に読み書きする簡易版はstd::fs::read_to_string() / write()を、標準入出力はstd::io::stdin() / stdout()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。