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

Тема в разделе ".NET", создана пользователем Villiya, 6 янв 2012.

  1. Villiya

    Villiya Гость

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

    Код (Text):
     
    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();
    }
    как это сделать?
     
  2. LuMee

    LuMee Well-Known Member

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

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

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

    Villiya Гость

    а если файл выглядит не так,а допустим
    Код (Text):
    Точка 1 2 7
    Точка 9 4 6 8 6 1
    Точка 59 12 7 6
    и как быть с ситуацией, если в файле еще и другие объекты
    Код (Text):
    Точка 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
    как в такой ситуации "разделить" точки, окружности и квадраты по своим массивам и заполнить эти массивы как-то так:
    Код (Text):
    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);

    ....
     
  4. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    в любой ситуации надо делать самому
     
  5. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Собственно, первое "слово" в каждой строке как раз идентифицирует сущность, к которой относятся последующие параметры. Проверяем это слово, создаем нужную сущность и кладем в нужный список. Вроде никакой высшей магии.
     
  6. Villiya

    Villiya Гость

    Код (Text):
    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 значения, а если их больше или меньше? т.е. кол-во нельзя определить заранее, только в ходе программы? т.е. генерируется файл и не зная его содержание необходимо его считать
     
  7. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Да, примерно так. Разве что List'ов, как я понимаю, может быть несколько - для разных объектов. Или один, если классы этих объектов имеют общего предка. В общем, смотрите, как вам будет удобнее в рамках вашей задачи.

    Количество идентификаторов, естественно, надо определять "на лету", если оно переменное. И составляет оно (в приведенном выше коде) splits.Length - 1. Соответственно, для каждой записи из файла от этого количества уже и надо плясать, создавая нужный объект тем или иным образом. Как именно - вам должно быть виднее, ибо я лично не знаю, что означают 5 идентификаторов для точки (ну первые три - координаты, допустим, а остальные?).
     
Загрузка...
Похожие Темы - Считывание Данных Из
  1. lira89
    Ответов:
    3
    Просмотров:
    3.314
  2. Alina26-89
    Ответов:
    4
    Просмотров:
    2.456
  3. Escaper
    Ответов:
    3
    Просмотров:
    38
  4. Valimor
    Ответов:
    1
    Просмотров:
    1.070
  5. julia9311
    Ответов:
    2
    Просмотров:
    1.457

Поделиться этой страницей