При чтении ранее записанного файла выводятся дополнительные пустые элементы. В чем ошибка ?

 
Всем здравствуйте !
Столкнулся с непонятным для себя. При чтении предварительно записанного файла, после считывания последнего значащего элемента выдается еще несколько пустых (= 0) элементов, причем в количестве равном одому обращению к процедуре в цикле. На форуме прочитал, что ошибка определения конца файла исправлена в build 203. Обрадовался, поскольку думал , что ошибка не моя. Обновил build 202 на 205. Проблема осталась. Посмотрите, пожалуйста кто не сильно занят. Где-то ошибка все же есть. Заранее благодарен. Анатолий.

Здесь фрагмент считывания.

if (firstTime_1==1)
     {
         handle=FileOpen("common_up_down_ind.csv",FILE_CSV|FILE_READ, ";");
         if(handle<1)  {Print("File (common_up_down_ind.csv) not found, the last error is ", GetLastError());  return(false);}
         firstTime_1=-1;
     }        
          if(handle>0)
 
          {
             while (!FileIsEnding(handle))
                        {           
                           abc_1=FileReadNumber(handle);
                           abc_2=FileReadNumber(handle);
                           abc_3=FileReadNumber(handle);
                           abc_4=FileReadNumber(handle);
                           abc_5=FileReadNumber(handle);
                           abc_6=FileReadNumber(handle);
                           k=FileReadNumber(handle);
                                    year_1[k]=abc_1;
                                    month_1[k]=abc_2;
                                    day_1[k]=abc_3;
                                    hour_1[k]=abc_4;
                                    min_1[k]=abc_5;
                                    up_down[k]=abc_6;
                           Print("общий принт  ", year_1[k],"  ",month_1[k],"  ",day_1[k],"  ",hour_1[k],"  ",min_1[k],"  ",up_down[k],"  ",k); 
                           elements=k;
                        }
                          FileClose(handle);   
                          handle=0; 
       }     
 //       …………………………………………………………….
//        …………………………………………………………….




здесь печать значений
//Из файла считываются   данные  в  последовательности:   год, месяц, день, час, мин,  значение
 
//общий принт  2007   5   31  23    0  -117.1   1
//общий принт  2007   5   31  23   15  -119.3   2
//…………………………………………………
//…………………………………………………
//общий принт  2007   6    1     3    0  -137.9   16    // последние значимые элементы из файла 
//общий принт     0   0    0     0    0     0      0  // последняя запись при чтении из файла (выводятся еще 7 элементов (17 строка, а в  файле 16, см.ниже)
здесь фрагмент записи в файл и сам файл - всего в 16 строк писалось.
  
      if (first_Time==1) {last_element=0;first_Time=-1;}
          
      if(Minute()==0 ||Minute()==15 || Minute()==30 || Minute()==45 )
    {
           k=last_element+1;       
     
           abc_1=Year();
           abc_2=Month();
           abc_3=Day();
           abc_4=Hour();
           abc_5=Minute();
           abc_6=AccountEquity();
           up_down=AccountEquity()-10000;
        
            indicator =FileOpen("common_up_down_ind.csv",FILE_CSV|FILE_READ|FILE_WRITE,';');
           
           if( indicator < 1) {Print("File (common_up_down_ind.csv) not found, the last error is ", GetLastError()); return(false);}
          
           if( indicator>0 )
        {            
             FileSeek(indicator, 0, SEEK_END);
             FileWrite(indicator,abc_1,abc_2,abc_3,abc_4,abc_5,up_down,k);
             last_element=k; 
             //--------wait for 60 seconds 
             Sleep(60000); // (in milliseconds)
             FileClose(indicator);   
             indicator=0;
         }
            
    }
 
// это сам файл – всего 16 строк.     
  
// 2007;5;31;23;0;-117.16;1
// 2007;5;31;23;15;-119.3;2
// 2007;5;31;23;30;-87.98;3
// 2007;6;1;0;0;-148.12;4
// 2007;6;1;0;15;-177.13;5
// 2007;6;1;0;30;-192.02;6
// 2007;6;1;0;45;-206.06;7
// 2007;6;1;1;0;-169.08;8
// 2007;6;1;1;15;-146.15;9
// 2007;6;1;1;30;-180.85;10
// 2007;6;1;1;45;-151.22;11
// 2007;6;1;2;0;-200.14;12
// 2007;6;1;2;15;-135.99;13
// 2007;6;1;2;30;-114.05;14
// 2007;6;1;2;45;-182.47;15
// 2007;6;1;3;0;-137.97;16
 
На вскидку,проблема может быть в том, что после записи числа не идет сразу символ конца файла,  а какой-нибудь лишний символ. Попробуй в процедуре чтения числа проверять конец файла после каждого числа.  Возможно на чтении 17-ой строки после прочтения первого числа (это будет 0), ты увидишь признак конца файла
 
anatoli:
Всем здравствуйте !
Столкнулся с непонятным для себя. При чтении предварительно записанного файла, после считывания последнего значащего элемента выдается еще несколько пустых (= 0) элементов, причем в количестве равном одому обращению к процедуре в цикле. На форуме прочитал, что ошибка определения конца файла исправлена в build 203. Обрадовался, поскольку думал , что ошибка не моя. Обновил build 202 на 205. Проблема осталась. Посмотрите, пожалуйста кто не сильно занят. Где-то ошибка все же есть. Заранее благодарен. Анатолий.

Сталкивался с подобным. Просто при записи 15 строк в файле будет 16, и последняя строка пустая.
А тебя После проверки считывается не одно значение а больше, и они естественно обнуляются.

Обычно вначале я записываю размер массива. А при считывании проблемы уже нету. Но на конец файла не проверяю.
 
Vinin:
anatoli:
Всем здравствуйте !
Столкнулся с непонятным для себя. При чтении предварительно записанного файла, после считывания последнего значащего элемента выдается еще несколько пустых (= 0) элементов, причем в количестве равном одому обращению к процедуре в цикле. На форуме прочитал, что ошибка определения конца файла исправлена в build 203. Обрадовался, поскольку думал , что ошибка не моя. Обновил build 202 на 205. Проблема осталась. Посмотрите, пожалуйста кто не сильно занят. Где-то ошибка все же есть. Заранее благодарен. Анатолий.

Сталкивался с подобным. Просто при записи 15 строк в файле будет 16, и последняя строка пустая.
А тебя После проверки считывается не одно значение а больше, и они естественно обнуляются.

Обычно вначале я записываю размер массива. А при считывании проблемы уже нету. Но на конец файла не проверяю.

Спасибо Scriptong и Vinin !
Вставил определение размера файла FilleSise() и проверку текущей позиции FileTell().
Теперь все работает нормально. С уважением Анатолий.
if (firstTime_1==1)
     {
         handle=FileOpen("common_up_down_ind.csv",FILE_CSV|FILE_READ, ";");
         if(handle<1)  {Print("File (common_up_down_ind.csv) not found, the last error is ", GetLastError());  return(false);}
         firstTime_1=-1;
     }        
          if(handle>0)
          
                    int file_size=FileSize(handle);   // определяет  размер   файла
 
          {
             while (!FileIsEnding(handle))
                        {  
 
                     if(FileTell(handle)==file_size)break;   // прерывает  процедуру  считывания 
 
                           abc_1=FileReadNumber(handle);
                           abc_2=FileReadNumber(handle);
                           abc_3=FileReadNumber(handle);
                           abc_4=FileReadNumber(handle);
                           abc_5=FileReadNumber(handle);
                           abc_6=FileReadNumber(handle);
                           k=FileReadNumber(handle);
                                    year_1[k]=abc_1;
                                    month_1[k]=abc_2;
                                    day_1[k]=abc_3;
                                    hour_1[k]=abc_4;
                                    min_1[k]=abc_5;
                                    up_down[k]=abc_6;
                           Print("общий принт  ", year_1[k],"  ",month_1[k],"  ",day_1[k],"  ",hour_1[k],"  ",min_1[k],"  ",up_down[k],"  ",k); 
                           elements=k;
                        }
                          FileClose(handle);   
                          handle=0; 
       }
 

Чтобы не заводить новую ветку...

Проблема похожая. Раньше с файлами практически не работал, помогите разобраться, пожалуйста!

Записал файл EURUSDvb.csv - во вложении - 100 строк по 8 чисел int. Пытаюсь читать. Вот фрагмент кода

int h_vb=FileOpen(sy+"vb.csv", FILE_CSV|FILE_READ);
      string st;
      if(h_vb>0)
         {
         Print("Читаем массив vb   ",h_vb);
         for(l=0;l<K;l++)
            {
            st="";
            for(j=0;j<N;j++)
               {
               vb[l,j]=FileReadNumber(h_vb);
               st=st+vb[l,j]+"  ";
               }
            Print("  l=",l,"  ",st);   
            }
         FileClose(h_vb);
         }

В распринтовке первая строка нормальная, остальные - нули (логфайл (2) во вложении).

Пытаюсь пойти другим путём: записать и считать не csv-файл, а массив в двоичный файл

int h_vb=FileOpen(sy+"vb.dat", FILE_BIN|FILE_WRITE|FILE_READ);
      Print("Записываем первый массив vb  ",h_vb);
      if(h_vb>0)
         {
         FileWriteArray(h_vb,vb,N+1,kb*N);
         FileReadArray(h_vb,vb,N+1,kb*N);
         FileClose(h_vb);
         }
      for(l=0;l<kb;l++)
         {
         st="";
         for(j=0;j<N;j++)st=st+vb[l,j]+"  ";
         Print("l_b=",l,"  ",st);
         }

В результате (первый логфайл) опять одна строка - нормальная, потом - первый элемент второй строки, а до 29 строки опять нули, а дальше - снова нормально. Причем, если заменить N+1 на 0 или 1, картина качественно не меняется - нормально начинает работать с 28 строки. (Здесь K и kb равно 100, а N=8).

Такое подозрение, что может с неявным преобразованием типов что-то не так. Или я где-то что-то не то делаю?

Файлы: