2015-04-11 4 views
0

Пример файла; квадратная матрица; размер матрицы после #Как читать матрицу из txt-файла в 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» и разобрать строку, но я запутался преобразование между строковыми и str.

+1

Добро пожаловать в Stack Overflow! Чтобы получить максимальную отдачу от ваших вопросов, пожалуйста, прочитайте [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask). В этом случае было бы настоятельно рекомендовано **, чтобы вы включили [MCVE] (http://stackoverflow.com/help/mcve), которые вы попробовали, чтобы мы могли понять проблему, с которой вы сталкиваетесь. Кроме того, я бы рекомендовал прочитать [30-минутный ввод [Rust Rust] (http://doc.rust-lang.org/intro.html) и [The Rust Book] (http://doc.rust-lang.org/nightly/book /), которые охватывают * много проблем, с которыми сталкиваются новички! – Shepmaster

ответ

3

Это наивная перевод кода в Руст:

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); 
} 

Существует более идиоматических способ выполнить петлю в Русте, хотя:

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); 
} 
+0

'let mut s = String :: new();' 'f.read_line (& mut s) .unwrap();' Эти действия необходимы? – vessd

+1

Вы имеете в виду последний пример, не так ли? Да, это необходимо - вам нужно пропустить первую строку, которая содержит количество элементов. Если вы можете изменить формат, чтобы у него не было первой строки, вы можете опустить их, конечно. –

+0

Теперь я понимаю, спасибо – vessd