C# Считывание Данных Из Файла

  • Автор темы Villiya
  • Дата начала
V

Villiya

#1
уважаемые программисты подскажите как поступить: есть файл из которого нужно считать содержимое, которое выглядит следующим образом
Код:
Точка 1 2 7
Точка 9 4 6
Точка 59 12 7
и заполнить массив

Код:
string name = "test01";	 
private void button1_Click(object sender, EventArgs e)
{
string strline;
string[] StrArr;
char differ = ' ';
StreamReader sr = new StreamReader(name);
strline = sr.ReadLine();
StrArr = strline.Split(differ);

if (StrArr[1] == "Точка")//данная проверка обязательна
{
int NumberOfPOints = ......;	// получить кол-во точек из файла
POintsArray = new POints[NumberOfPOints];//создать масссив размером NumberOfPOints 

//заполнить этот массив значениями из файла ну что-то типа такого

// POintsArray[0] = new POints(1, 2, 7);
// POintsArray[1] = new POints(9,4, 6);
// POintsArray[2] = new POints(59, 12, 7);

..........

strline = sr.ReadLine();

}
sr.Close();
}
как это сделать?
 

LuMee

Well-known member
02.05.2006
477
0
#2
В вышеприведенном коде массив StrArr будет содержать все необходимое: нулевой элемент (а не 1й!) - "Точка", остальные - координаты, или что там у вас. Нужно проверить, что:
1) количество координат - 3 (проверяем длину массива)
2) строковые значения этих координат приводятся к int (тут рекомендую метод Int32.TryParse).

Узнавать количество строк в файле необязательно, проще читать строки одну за одной, а результаты их разбора (объекты класса POints) складывать, например, в List<POints> или другую подобную коллекцию.

Разумеется, файл читать удобнее всего в цикле. Пример можно поглядеть, скажем, тут.
 
V

Villiya

#3
а если файл выглядит не так,а допустим
Код:
Точка 1 2 7
Точка 9 4 6 8 6 1
Точка 59 12 7 6
и как быть с ситуацией, если в файле еще и другие объекты
Код:
Точка 1 2 7
Точка 9 4 6
Окружность 25 15 10 6
Точка 59 12 7
Окружность 2 7 10 15 10
Квадрат 2 2 2 4 4 4
Квадрат 26 57 48 5 7
как в такой ситуации "разделить" точки, окружности и квадраты по своим массивам и заполнить эти массивы как-то так:
Код:
int NumberOfPOints = ......;	// получить кол-во точек из файла
POintsArray = new POints[NumberOfPOints];//создать масссив размером NumberOfPOints 

//заполнить этот массив значениями из файла ну что-то типа такого

// POintsArray[0] = new POints(1, 2, 7);
// POintsArray[1] = new POints(9,4, 6);
// POintsArray[2] = new POints(59, 12, 7);
....
int NumberOfСircle = ......;
СircleArray = new Сircle[NumberOfСircle];//создать масссив размером NumberOfPOints 

//заполнить этот массив значениями из файла ну что-то типа такого

// СircleArray[0] = new Сircle(25, 15, 10, 6);
// СircleArray[1] = new Сircle(2, 7, 10, 15, 10);
....
int NumberOfRects = ......;	// получить кол-во точек из файла
Rects Array = new Rects [NumberOfRects ];//создать масссив размером NumberOfPOints 

//заполнить этот массив значениями из файла ну что-то типа такого

// RectsArray[0] = new Rects (2, 2, 2, 4, 4, 4);
// RectsArray[1] = new Rects (26, 57, 48, 5, 7);

....
 

LuMee

Well-known member
02.05.2006
477
0
#5
как в такой ситуации "разделить" точки, окружности и квадраты по своим массивам
Собственно, первое "слово" в каждой строке как раз идентифицирует сущность, к которой относятся последующие параметры. Проверяем это слово, создаем нужную сущность и кладем в нужный список. Вроде никакой высшей магии.
 
V

Villiya

#6
Код:
struct Point3
{
public int X
{
get;
set;
}
public int Y
{
get;
set;
}
public int Z
{
get;
set;
}
}

class Program
{
static void Main(string[] args)
{
StreamReader reader = new StreamReader(@"D:\points.txt");
List<Point3> points = new List<Point3>();
string s = string.Empty;
while ((s = reader.ReadLine()) != null)
{
string[] splits = s.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
if (splits[0]=="Точка")
{
points.Add(new Point3
{
X = int.Parse(splits[1]),
Y = int.Parse(splits[2]),
Z = int.Parse(splits[3])
});
}
if (splits[0]=="Окружность")
{
....
}
if (splits[0]=="Квадрат")
{
...
}
}
reader.Close();		
}
}
т.е. это будет выглядеть как-то так? - проверка на то какое первое слово, а дальше запись в List? но в данном случае это подходит для варианта когда за словом-идентификатором идет только 3 значения, а если их больше или меньше? т.е. кол-во нельзя определить заранее, только в ходе программы? т.е. генерируется файл и не зная его содержание необходимо его считать
 

LuMee

Well-known member
02.05.2006
477
0
#7
т.е. это будет выглядеть как-то так? - проверка на то какое первое слово, а дальше запись в List?
Да, примерно так. Разве что List'ов, как я понимаю, может быть несколько - для разных объектов. Или один, если классы этих объектов имеют общего предка. В общем, смотрите, как вам будет удобнее в рамках вашей задачи.

но в данном случае это подходит для варианта когда за словом-идентификатором идет только 3 значения, а если их больше или меньше?
Количество идентификаторов, естественно, надо определять "на лету", если оно переменное. И составляет оно (в приведенном выше коде) splits.Length - 1. Соответственно, для каждой записи из файла от этого количества уже и надо плясать, создавая нужный объект тем или иным образом. Как именно - вам должно быть виднее, ибо я лично не знаю, что означают 5 идентификаторов для точки (ну первые три - координаты, допустим, а остальные?).