Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Сделал скриншот в MetaTrader? Поделись им с друзьями!
Rorschach
717
Rorschach 2012.08.19 19:30 
   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
5221
Vadim Zhunko 2012.08.19 19:49  

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

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

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

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

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

Рустам
3603
Рустам 2012.08.19 20:08  

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

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

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

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

Rorschach
717
Rorschach 2012.08.19 20:12  

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

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);
перестало зависать, странно все это
Рустам
3603
Рустам 2012.08.19 20:24  
FileReadString() учитывает разделители.
Vadim Zhunko
5221
Vadim Zhunko 2012.08.20 08:42  
Все функции чтения CSV-файла учитывают разделители. Если последнего разделителя строк нет (\r\n), то функция не знает, где заканчивать чтение. Тем более, что у Вас нет проверки на конец файла.
Rorschach
717
Rorschach 2012.08.20 08:48  
Zhunko:
Все функции чтения CSV-файла учитывают разделители. Если последнего разделителя строк нет (\r\n), то функция не знает, где заканчивать чтение. Тем более, что у Вас нет проверки на конец файла.

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



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

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

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