|
|
|
новичок
      
участник
Last Login: 10.11.2005 2:51
Сообщ.: 8,
Visits: 89
|
|
У меня есть файл (текстовый) типа:
1.5 2.3
3.5 5.6
только матрица не 2х2, а гигантская.
Как такой файл прочитать на С#. На с++ - это практически две строчки кода.
Я не нашёл функции считывания из текстового файла переменой базового типа: либо целиком строку (ReadLine()), либо массив байтов (Read(..)). Бинарные потоки мне не помогут т.к. для них нужны бинарные файлы.
Извращения типа прочитать строку и сомому раздраконить на числа я не рассматриваю.
Заранее спасибо.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Методов чтения/записи базовых типов мне найти не удалось. Так что придется читать строку целиком, разбивать ее на части методом Split и вызывать для каждого элемента double.Parse или Convert.ToDouble.
|
|
|
|
|
новичок
      
участник
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 А зачем по сравнению с С++ при выводе чисел с плавающей точкой заменили точку на запятую? Это тоже требования безопасного кода?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541,
Visits: 16 997
|
|
[quote="zarva"]PS А зачем по сравнению с С++ при выводе чисел с плавающей точкой заменили точку на запятую? Это тоже требования безопасного кода? [/quote]
Нет, это соответствие региональным настройкам :)
|
|
|
|
|
новичок
      
участник
Last Login: 10.11.2005 2:51
Сообщ.: 8,
Visits: 89
|
|
[quote="Messir"]
Нет, это соответствие региональным настройкам :)[/quote]
Чьим? Африканским?
|
|
|
|
|
Supreme Being
      
участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541,
Visits: 16 997
|
|
[quote="zarva"][quote="Messir"]
Нет, это соответствие региональным настройкам :)[/quote]
Чьим? Африканским?[/quote]
Системными.
Вероятно - русскими... )
|
|
|
|
|
новичок
      
участник
Last Login: 10.11.2005 2:51
Сообщ.: 8,
Visits: 89
|
|
| да хоть марсианским.. как число по-человечески из файла прочитать?
|
|
|
|
|
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("");
}
}
}
}
}
|
|
|
|
|
|
| |