Как через цикл записать данные у текстовый файл? - страница 2

 
Ihor Herasko:

sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется только размер указателя на строку, а не длина строки:

Результат:

Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант - StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.

Ясно! Спасибо!

Поробовал просто записать, без StringToShortArray()... Вроде пишет int и string без проблем

 

Что-то какая-то муть.  Код должен писать string и int (инты из массива):

 int fileHandle=FileOpen("report.txt",FILE_READ|FILE_WRITE|FILE_TXT);
      
      if(fileHandle!=INVALID_HANDLE){
         for (int i=0; i<500; i++){
            ResetLastError();
            int writeErr= FileWrite(fileHandle, " модель: ",i," количество: ",statInfo[i][0][0]," позитивных исходов: ", statInfo[i][1][0], " негативных: ", statInfo[i][2][0]);
           
            if (writeErr!=sizeof(statInfo)& writeErr!=12) 
               PrintFormat("Ошибка во время записи. Строка: %d Записано байт: %d Код ошибки: %d",i,writeErr, GetLastError());
 
             if (i%100==0){
             FileFlush(fileHandle);
             PrintFormat("i = %d, OK",i);
             }
         }
         FileClose(fileHandle);
         Comment("Данные успешно записаны");
      }else 
      PrintFormat("Не удалось открыть файл, Код ошибки = %d",GetLastError()); 

Сначала в массиве в первом измерении было 1000.

int statInfo[1000][3][4];


Во время записи постоянно, где-то после половины массива (итерации, приблизительно после 500) скрипт начинал заходить в:

if (writeErr!=sizeof(statInfo)& writeErr!=12)
PrintFormat("Ошибка во время записи. Строка: %d Записано байт: %d Код ошибки: %d",i,writeErr, GetLastError());

Ошибки не печатает (ноль постоянно). Зато печатает байты, непонятно откуда взявшиеся. Типа:

2019.08.05 17:46:31.895	Report EURUSD,H1: Ошибка во время записи. Строка: 553 Записано байт: 64 Код ошибки: 0
2019.08.05 17:29:19.096 Report EURUSD,H1: Ошибка во время записи. Строка: 766 Записано байт: 79 Код ошибки: 0
2019.08.05 17:29:19.096 Report EURUSD,H1: Ошибка во время записи. Строка: 765 Записано байт: 71 Код ошибки: 0
2019.08.05 17:29:19.096 Report EURUSD,H1: Ошибка во время записи. Строка: 764 Записано байт: 64 Код ошибки: 0

Решил уменьшить в двое первое измерение, до 500. Не помогло. С половины (приблизительно после 250 шага) итерации  ( в данном случае откуда и покуда не сильно важно - всегда после половины где-то начинается) пишет, что записано 64 байт(иногда - 56), хотя в ячейках массива стоят нули. Нули так же в отчете:

 модель: 253 количество: 0 позитивных исходов: 0 негативных: 0

Далее, ближе к концу итерации, идет в разнобой. В журнале пишет, что записано 79 (или 71,80,84...) байтов (как в примере ранее). В отчете какие-то циферки появиляются тож:

 модель: 465 количество: 0 позитивных исходов: 17472121 негативных: 6
 модель: 466 количество: 20851808 позитивных исходов: 386005568 негативных: 278505990
 модель: 467 количество: 128904 позитивных исходов: -1578072695 негативных: 386005572

 Так же, в качестве решения, в справке нашел функцию FileFlush. И поставил чтобы скрипт скидал все на диск после каждой сотой итерации.

if (i%100==0){
       FileFlush(fileHandle);
       PrintFormat("i = %d, OK",i);

Ну это я так, пальцем в небо. Все равно не помогло.

Последнее что делал: после расчетов, перед записью данных в отчет, все ячейки массива после 230 измерения заполнил нулями :

  for (int i=230; i<500; i++){
          for (int j=1; j<3; j++){
            for (int k=1; k<4; k++){
               statInfo[i][j][k]=0;
      }}}

Скрипт перестал лить дичь в отчет. Всякие непонятные большие циферки исчезли. Решение грубое и неполноценное, потому как журнал все равно пишет ошибки. Хотя теперь все данные занимают 64 байта.

2019.08.05 18:05:43.560 Report EURUSD,H1: Ошибка во время записи. Строка: 302 Записано байт: 64 Код ошибки: 0

Я пробовал перед расчетами заполнять массив - не помогало.

Хотя при расчетах, мне кажется, дикие циферки не могли появиться. Умножения нет, только простое инкрементирование и запись в массив (при итерационном цикле от 0 до 6336, число 386005568 не может появится же). Кроме того, большие циферки в отчете не появляются в какой-то определенной ячейке(согласно массиву) - в разнобой все происходит.  То есть, в двух идентичных отчетах, при совершенно одинаковых параметрах, большие циферки в отчетах появляются в разных местах и с разными значениями. Посмотрите сами в прикрепленных репортах в конце....

Что это может быть?

Файлы:
report.txt  32 kb
report1.txt  32 kb
 
Ihor Herasko:

sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется только размер указателя на строку, а не длина строки:

Результат:

Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант - StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.

 

Николай Казанцев в mql4 справочнике очень мало про это ...

Причина обращения: