Как прочитать матрицу из файла на С#?
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как прочитать матрицу из файла на С#? Expand / Collapse
Автор
Сообщение
10.11.2005 3:04
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 10.11.2005 2:51
Сообщ.: 8, Visits: 89
У меня есть файл (текстовый) типа:

1.5 2.3
3.5 5.6

только матрица не 2х2, а гигантская.
Как такой файл прочитать на С#. На с++ - это практически две строчки кода.
Я не нашёл функции считывания из текстового файла переменой базового типа: либо целиком строку (ReadLine()), либо массив байтов (Read(..)). Бинарные потоки мне не помогут т.к. для них нужны бинарные файлы.
Извращения типа прочитать строку и сомому раздраконить на числа я не рассматриваю.

Заранее спасибо.
Сообщ. #884478
10.11.2005 11:40
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Методов чтения/записи базовых типов мне найти не удалось. Так что придется читать строку целиком, разбивать ее на части методом Split и вызывать для каждого элемента double.Parse или Convert.ToDouble.
Сообщ. #884501
10.11.2005 18:12
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 10.11.2005 2:51
Сообщ.: 8, Visits: 89
[quote="bazile"]Методов чтения/записи базовых типов мне найти не удалось. Так что придется читать строку целиком, разбивать ее на части методом Split и вызывать для каждого элемента double.Parse или Convert.ToDouble.[/quote]

Но по сравнению с чем-нибудь типа fscanf(f,"%f",&a) для С++ - читать строку целиком - это БРЕД, да к тому же это ещё и, очевидно, медленно.
А как тогда одним оператором реализовать fscanf(f,"%f %d", &a, &b ), особенно если числа записаны не подряд а в столбик? Можно конечно считать строку, сделать split убедиться, что в строке одно число сделать Parse или Convert, затем считать второе число и т.д. - но по-моему это проще на ассемблере (или убогом Фортране) сделать, но если так дальше пойдёт, тогда через 10 лет, операцию умножения придётся самому писать, а COM-сервер будет "в одно касание"!

PS А зачем по сравнению с С++ при выводе чисел с плавающей точкой заменили точку на запятую? Это тоже требования безопасного кода?
Сообщ. #884537
10.11.2005 20:35


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
[quote="zarva"]PS А зачем по сравнению с С++ при выводе чисел с плавающей точкой заменили точку на запятую? Это тоже требования безопасного кода? [/quote]

Нет, это соответствие региональным настройкам :)



Сообщ. #884546
11.11.2005 0:04
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 10.11.2005 2:51
Сообщ.: 8, Visits: 89
[quote="Messir"]
Нет, это соответствие региональным настройкам :)[/quote]

Чьим? Африканским?
Сообщ. #884556
11.11.2005 0:10


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
[quote="zarva"][quote="Messir"]
Нет, это соответствие региональным настройкам :)[/quote]

Чьим? Африканским?[/quote]

Системными.
Вероятно - русскими... )



Сообщ. #884557
11.11.2005 0:15
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 10.11.2005 2:51
Сообщ.: 8, Visits: 89
да хоть марсианским.. как число по-человечески из файла прочитать?
Сообщ. #884558
11.11.2005 11:51
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
[quote="zarva"]Но по сравнению с чем-нибудь типа fscanf(f,"%f",&a) для С++ - читать строку целиком - это БРЕД, да к тому же это ещё и, очевидно, медленно.[/quote]
Прежде чем бросаться словами "бред" и "медленно" неплохо бы проверить. Построчное чтение не означает что классы .NET не используют промежуточный буфер и что это обязательно будет медленно.

[quote="zarva"]А как тогда одним оператором реализовать fscanf(f,"%f %d", &a, &b ), особенно если числа записаны не подряд а в столбик?[/quote]
Одной строкой никак. Разве что ты напишешь свою реализацию форматированного ввода/вывода.

[quote="zarva"]PS А зачем по сравнению с С++ при выводе чисел с плавающей точкой заменили точку на запятую? Это тоже требования безопасного кода?[/quote]
Этим можно управлять используя нужный CultureInfo.

И вот тебе пример считывания чисел из файла
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;


public class ConsoleApp
{
public static void Main()
{
Regex reSpaces = new Regex(@"\s+");

CultureInfo ciEn = new CultureInfo("en-US"); // раделитель .
//CultureInfo ciRu = new CultureInfo("ru-RU"); // раделитель ,
using (StreamReader sr = new StreamReader(@"d:\test.txt", Encoding.GetEncoding("windows-1251")))
{
while (sr.Peek() != -1)
{
string line = sr.ReadLine().Trim();
if (line.Length > 0)
{
//string[] parts = line.Split('' '');
string[] parts = reSpaces.Split(line);

for (int i=0; i {
double d = double.Parse(parts[i], ciEn);
if (i > 0) Console.Write("\t");
Console.Write(d);
}
Console.WriteLine("");
}
}
}
}
}
Сообщ. #884597
11.11.2005 13:04