如何从 Rust 中的 txt 文件中读取矩阵?

How to read a matrix from a txt file in Rust?

文件示例;方阵; #

之后的矩阵大小
#3
1.1 -0.2 0.1
0.1 -1.2 -0.2
0.2 -0.1 1.1

大约所以我会用 C 写它

double **A;
int i,j,size=0;
FILE *f=NULL;

f=fopen("input.txt","w");
fscanf(f,"#%d\n",&size);
A=(double**)malloc(size*sizeof(double*));
for(i=0;i<size;i++)
    A[i]=(double*)malloc(size*sizeof(double));

for(i=0;i<size;i++)
{
    for(j=0;j<size;j++)
    {
        fscanf(f,"%lf",&A[i][j]);
    }
}
fclose(f);

我尝试使用"read_to_string"方法解析String,但是String和str之间的转换让我很困惑

这是将您的代码简单地翻译成 Rust:

use std::fs::File;
use std::io::{BufRead, BufReader};

fn main() {
    // open the file
    let mut f = BufReader::new(File::open("input.txt").unwrap());

    // read the first line and extract the number from it
    let mut num_line = String::new();
    f.read_line(&mut num_line).unwrap();
    let n: usize = num_line[1..].trim().parse().unwrap();

    // preallocate the array and read the data into it
    let mut arr = vec![vec![0f64; n]; n];
    for (i, line) in f.lines().enumerate() {
        for (j, number) in line.unwrap().split(char::is_whitespace).enumerate() {
            arr[i][j] = number.trim().parse().unwrap();
        }
    }

    println!("{:?}", arr);
}

不过,在 Rust 中有更惯用的方式来执行循环:

use std::fs::File;
use std::io::{BufRead, BufReader};

fn main() {
    let mut f = BufReader::new(File::open("input.txt").unwrap());

    let mut num_line = String::new();
    f.read_line(&mut num_line).unwrap();
    let n: usize = num_line[1..].trim().parse().unwrap();

    let arr: Vec<Vec<f64>> = f.lines()
        .take(n)
        .map(|l| l.unwrap().split(char::is_whitespace)
             .take(n)
             .map(|number| number.parse().unwrap())
             .collect())
        .collect();

    println!("{:?}", arr);
}

事实上,如果你的文件格式完全固定,你甚至不需要提前读取数据的行数:

use std::fs::File;
use std::io::{BufRead, BufReader};

fn main() {
    let mut f = BufReader::new(File::open("input.txt").unwrap());

    let mut s = String::new();
    f.read_line(&mut s).unwrap();

    let arr: Vec<Vec<f64>> = f.lines()
        .map(|l| l.unwrap().split(char::is_whitespace)
             .map(|number| number.parse().unwrap())
             .collect())
        .collect();

    println!("{:?}", arr);
}