如何在Rust中读写文本文件?

18

注意:此问题涉及到 Rust 1.0 之前的版本,因此已过时。请参考链接的重复问题获取最新的答案。

我正在使用 Windows 8 上的 Rust 0.8 编写一个测试程序,并需要使用数组/向量/列表来访问单个行,从文本文件中读取和写入程序用到的一些参数。

在尝试了很长时间后,我发现最接近的方法如下:

use std::rt::io::{file, Open};
use std::path::Path;
use std::rt::io::file::FileInfo;

fn main () {

    let mut reader : file::FileReader = Path("xxxx.txt").open_reader(Open)  
    .expect("'xxxx.txt' could not be opened");

    println("Completed");   
}

如果文件存在,上述“工作”。

请有人给我展示一个如何满足我所述要求的示例?


2
rust 的世界里,0.8版本已经很老了,现在你需要使用 let filereader = File::open(p) - cnd
从1.7版本开始,在参考文档中查看BufReader的示例:http://doc.rust-lang.org/std/io/struct.BufReader.html#examples - steamer25
1个回答

9

注意:本回答针对 Rust 1.0 之前的版本,已经过时。请参阅链接的重复内容获取最新的答案。

是的,0.8 版本太旧了,对于 0.10-pre 的主分支,我会使用:

use std::io::BufferedReader;
use std::io::File;
use std::from_str::from_str;

let fname = "in.txt";
let path = Path::new(fname);
let mut file = BufferedReader::new(File::open(&path));

for line_iter in file.lines() {
    let line : ~str = match line_iter { Ok(x) => x, Err(e) => fail!(e) };
    // preprocess line for further processing, say split int chunks separated by spaces
    let chunks: ~[&str] = line.split_terminator(|c: char| c.is_whitespace()).collect();
    // then parse chunks
    let terms: ~[int] = vec::from_fn(nterms, |i: uint| parse_str::<int>(chunks[i+1]));
    ...
}

在哪里

fn parse_str<T: std::from_str::FromStr>(s: &str) -> T {
    let val = match from_str::<T>(s) {
        Some(x) => x,
        None    => fail!("string to number parse error")
    };
    val
}

写入文本文件:

use std::io::{File, Open, Read, Write, ReadWrite};
use std::path::Path;

let fname = "out.txt"
let p = Path::new(fname);

let mut f = match File::open_mode(&p, Open, Write) {
    Ok(f) => f,
    Err(e) => fail!("file error: {}", e),
};

然后你可以使用任何一个

f.write_line("to be written to text file");
f.write_uint(5);
f.write_int(-1);

文件描述符会在作用域退出时自动关闭,因此没有f.close()方法。希望这能帮到你。

你从哪里找到了 nterms?它是什么? - Syntactic Fructose
4
你能否将它更新至 Rust 1.0 版本? - Kornel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接