Скачать MetaTrader 5

Зависание при чтении с файла

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Rorschach
717
Rorschach  
   int a=FileOpen("123.txt",FILE_CSV|FILE_READ,'\t');
   double A[5][3];
   int i,j;
   for(i=0;i<5;i++)
      for(j=0;j<3;j++)
         A[i][j]=FileReadNumber(a);
Если в конце файла 123.txt нету Enter, то скрипт зависает. С этим можно как то бороться?
Vadim Zhunko
5226
Vadim Zhunko  

Открыть его, как бинарный. Должно помочь. Только придётся повозиться с длиной прочитанного самому.

Проще разделитель требуемый поставить.

Рустам
3597
Рустам  
Легче будет прочитать файл в строковый массив, а потом уже в нем копатся. Ну быстрее - это точно.
Vadim Zhunko
5226
Vadim Zhunko  
FAQ:
Легче будет прочитать файл в строковый массив, а потом уже в нем копатся. Ну быстрее - это точно.

Да. Это самый быстрый способ, но только, если много обращений к файлу.

Замерял, как-то. Получилось, что однократное обращение к файлу за 8 байтами быстрее, чем чтение его в массив, раз в 10. Есть большие расходы времени на выделение памяти.

Рустам
3597
Рустам  

Согласен, решение в любом случае надо подбирать индивидуально для каждого случая.

Судя по размеру массивов (выше) == 15, все это уместится (умещается в одну строку)

однократный FileReadString() во входную строку, и последующий парсинг.

или открыть как бинарный.

Rorschach
717
Rorschach  

Заменил на стринг

int a=FileOpen("123.txt",FILE_CSV|FILE_READ,'\t');
   string A[5][3];
   int i,j;
   for(i=0;i<5;i++)
      for(j=0;j<3;j++)
         A[i][j]=FileReadString(a);
перестало зависать, странно все это
Рустам
3597
Рустам  
FileReadString() учитывает разделители.
Vadim Zhunko
5226
Vadim Zhunko  
Все функции чтения CSV-файла учитывают разделители. Если последнего разделителя строк нет (\r\n), то функция не знает, где заканчивать чтение. Тем более, что у Вас нет проверки на конец файла.
Rorschach
717
Rorschach  
Zhunko:
Все функции чтения CSV-файла учитывают разделители. Если последнего разделителя строк нет (\r\n), то функция не знает, где заканчивать чтение. Тем более, что у Вас нет проверки на конец файла.

   while(!FileIsEnding(a))
     {A[i][j]=FileReadNumber(a);
      if(!FileIsLineEnding(a)) j++;
      else {i++; j=0;}
Это было в первом варианте скрипта, тоже зависало без Интера.
Vadim Zhunko
5226
Vadim Zhunko  
Всё же, последний перенос строки должен быть в CSV-файле.
Rorschach
717
Rorschach  
Zhunko:
Всё же, последний перенос строки должен быть в CSV-файле.



Он там есть, но если вдруг удалю случайно будет неприятно.

ЗЫ. После тех зависаний комп долго не хотел выключаться, выводилось окно "Завершить работу Терминала". Нажимаю Завершить, через несколько секунд опять тот же вопрос. Раз 5 нажал Завершить, потом надоело, через кнопку Пуск на системнике выключил.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий