Logo

Вход

Войти с помощью соц. сетей
Пока нет объявлений.
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения
  • #1 Свернуть

    Чтение файла

    В документации по мкл5 написан пример чтения файла, такой же в принципе как и в статье. Оба кривые напрочь. По сему хочется обсудить этот момент.
    Имеется файл в кодировке UTF-8. Его я прилагаю к посту на всякий случай. Написал функцию для того, что бы прочитать весь файл построчно. Но читается 1 первая строка и всё. Вот код:
    PHP код:
    // Чтение runtime-данных из csv-файла. ====================================================================================================================================================
    void readRuntmeData(string path,                   // Каталог, в котором находится файл
                        
    string file,                   // Файл, из которого читаются данные
                        
    string dataToReadexport {    // runtime-данные для чтения
    //---
      
    string fileName getName() + "_runtime" ".csv";
      
    int handle FileOpen(fileNameFILE_READ|FILE_SHARE_READ|FILE_TXT";"CP_UTF8);

      if (
    handle != INVALID_HANDLE) {
    //    while (!FileIsEnding(handle)) {

        
    Print("size = "FileSize(handle));
        for (
    int i 1; !FileIsEnding(handle); i++) {
          Print(
    "_pos = "FileTell(handle));
          Print(
    FileReadString(handle));
          Print(
    "pos = "FileTell(handle));
          
    FileSeek(handle1SEEK_CUR);
          
    i++;
        }
        Print(
    "Вышли из цикла");
        
    FileClose(handle);
      } else {
        Print(
    "Файл не удалось прочитать..!");
      }

    Просьба не обращать внимания не параметры функции. Они на будущее. На данный момент, не до них. Так вот в статье, на которую я дал ссылку у автора якобы так работает. В официальной недоделанной документации тоже самое как и в той статье. Тоже на актуально.
    У меня в журнале экспертов вот что:
    2018.05.27 18:55:07.801 testMethod (EURUSD,D1) size = 76
    2018.05.27 18:55:07.801 testMethod (EURUSD,D1) _pos = 2
    2018.05.27 18:55:07.801 testMethod (EURUSD,D1) 3333021;2018.05.25 15:23:16;1.25738
    2018.05.27 18:55:07.801 testMethod (EURUSD,D1) pos = 76
    2018.05.27 18:55:07.801 testMethod (EURUSD,D1) Вышли из цикла
    А содержимое файла, который я хочу прочитать вот:
    PHP код:
    33330215;2018.05.25 15:23:16;1.25738
    33330219
    ;;
    3333023;2018.05.25 15:23:17;1.25741
    3333024
    ;2018.05.25 15:23:19;1.25745
    3333025
    ;2018.05.25 15:23:23;1.25749 
    Из этого я вижу, что размер файла в байтах почему-то 76. После прочтения 1-ой строки файловый указатель уже на 76-м.. и всё. Конец! Хотя ещё 4 строки нужно прочитать до конца файла. Как это вообще понимать?
  • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
  • #2 Свернуть

    Сообщение от скальпер Посмотреть сообщение
    Как это вообще понимать?
    Ну... Как минимум, как невнимательное чтение документации.
     

    Комментарий

    • #3 Свернуть

      Кстати, вот мой изначальный вариант функции. Как в документации уже точно. Тот что я выше привёл это уже передел:
      PHP код:
      void readRuntmeData(string path,                   // Каталог, в котором находится файл
                          
      string file,                   // Файл, из которого читаются данные
                          
      string dataToReadexport {    // runtime-данные для чтения
      //---
        
      string fileName getName() + "_runtime" ".csv";
        
      int handle FileOpen(fileNameFILE_READ|FILE_SHARE_READ|FILE_TXT";"CP_UTF8);

        if (
      handle != INVALID_HANDLE) {
          while (!
      FileIsEnding(handle)) {
            Print(
      "size = "FileSize(handle));
            Print(
      "_pos = "FileTell(handle));
            Print(
      FileReadString(handle));
            Print(
      "pos = "FileTell(handle));
          }
          Print(
      "Вышли из цикла");
          
      FileClose(handle);
        } else {
          Print(
      "Файл не удалось прочитать..!");
        }

      Сообщение от ir0407 Посмотреть сообщение
      Ну... Как минимум, как невнимательное чтение документации.
      И в чём же?
      FileIsEnding() - Определяет конец файла в процессе чтения.. Пока не достигли конца файла цикл должен исполняться. Верно? Верно! Идём дальше..
      Вызов функции FileReadString() - Читает из файла строку с текущего положения файлового указателя. Как я понял, читает всю строку, если файл текст, а если с разделителями до первого разделителя и переводит указатель на конец чтения.
       

      Комментарий

      • #4 Свернуть

        Кстати, на мт4 это работает, а на мт5 нет. Вот я видео записал даже:
        https://youtu.be/pmCfGnl9U80
           

        Комментарий

        • #5 Свернуть

          Сообщение от скальпер Посмотреть сообщение
          И в чём же?
          Не могу знать... Однако, у меня все работает...
             

          Комментарий

          • #6 Свернуть

            Сообщение от ir0407 Посмотреть сообщение
            Не могу знать... Однако, у меня все работает...
            Ну так всё теперь понятно. Косяк есть. Между нашими скриптами есть разница в открытии файла. У Вас:
            PHP код:
              int handle FileOpen(FileNameFILE_READ|FILE_SHARE_READ|FILE_TXT|FILE_ANSI";"CP_UTF8); 
            У меня так:
            PHP код:
              handle FileOpen(fileNameFILE_READ|FILE_SHARE_READ|FILE_TXT";"CP_UTF8); 
            Таким образом, я не использовал FILE_ANSI. И вообще, каким боком ANSI приходится к чтению файла в кодировке UTF-8 ?
            Это совсем разные вещи, между прочим. Здесь об этом более подробно.

            В "чудесной документации" сказано, в прочем, как и есть на самом деле, что:
            Строки типа ANSI (однобайтовые символы). Флаг используется при открытии файлов (FileOpen())
            Строки типа UNICODE (двухбайтовые символы). Флаг используется при открытии файлов (FileOpen())

            Таким образом, если файл в кодировке юникод, каким боком флаг FILE_ANSI здесь?
            Причём, в мт4 с любым флагом работает..
               

            Комментарий

            • #7 Свернуть

              Сообщение от скальпер Посмотреть сообщение
              И вообще, каким боком ANSI приходится к чтению файла в кодировке UTF-8 ?
              Это совсем разные вещи, между прочим.
              Ошибаетесь... Юникод бывает разный... И однобайтный тоже, чему есть подтверждение существованием формата UTF-8. UTF-8 - это суррогатный принцип кодировки, но все же это тот же однобайтный ANSI, что и отражено числом 8(8 бит = 1 байт) в его названии, но только пока используется диапазон цифр и латиницы, которые кодируются одним байтом. Национальные же символы, отличные от латиницы, кодируются в нем двумя байтами. Плюс есть еще кой какие плюшки. Читаем тут. Откройте оба текстовика в двоичном редакторе и сравните содержимое побайтно. Тогда станет понятно. А вот реальный юникод изначально подразумевает использование двух байт на символ (и более) и кодировку, как минимум, UTF-16.


              Сообщение от скальпер Посмотреть сообщение
              Таким образом, если файл в кодировке юникод, каким боком флаг FILE_ANSI здесь?
              Причём, в мт4 с любым флагом работает..
              В MQL4 по умолчанию идет работа именно с файлами ANSI, поэтому флаг FILE_ANSI можно не использовать, т.к. он используется по умолчанию. А в MQL5 по умолчанию используется юникод и флаг FILE_ANSI для UTF-8 там использовать нужно.
                 

              Комментарий

              • #8 Свернуть

                Бардак какой-то. Если не перешли на 2-байтовый режим, не дёргались бы. В нормальном языке в такие дебри вообще не лазишь. Взял фрейворк и распарсил что-то или записал, а тут мозг перегрузился((
                 

                Комментарий

                • <a href="https://www.instaforex.org/ru/?x=ruforum">InstaForex</a>
                • #9 Свернуть

                  Сообщение от скальпер Посмотреть сообщение
                  Бардак какой-то. Если не перешли на 2-байтовый режим, не дёргались бы.
                  Нет там бардака. Есть просто фичи... Как впрочем и у любого другого языка. И в кодировках все же нужно разбираться прежде чем где-то их использовать.


                  Сообщение от скальпер Посмотреть сообщение
                  В нормальном языке в такие дебри вообще не лазишь. Взял фрейворк и распарсил что-то или записал, а тут мозг перегрузился((
                  А разве кто-то вам обещал в простом собственном скриптовом языке полную совместимость с "нормальными языками"? И потом... Когда нормальному программисту не нравится что-то из стандартной поставки, он всегда может замутить собственную реализацию функции или класса, где все уж точно будет по феншую(в его понимании). Да и в вашем случае даже парсить ничего не нужно если вместо FILE_TXT использовать FILE_CSV. И дергай себе нужные данные в нужном порядке без напряга.
                   

                  Комментарий

                  Сейчас онлайн

                  working...
                  X