FileIsLIneEnding

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

FileIsLIneEnding

Nieprzeczytany post autor: Esco »

Witam

Jak przejść do następnej linii po przeczytaniu wszystkich rekordów z pierwszej?

Wczytuje przykładowo 300 wartości z pierwszej linii i FileIsLIneEnding cały czas zwraca dalej true podczas gdy mam w kolejnej pętli do przeczytania następne wartości.

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

Nie rozumiem.
Masz plik , podzielony na rekordy , w każdej linii ileś tam danych , po wczytaniu kompletnej linii funkcja nie zwraca true .Tak ?
A może kawałek kodu .
Logicznie - jak przeczytasz całą linię to funkcja zwróci true i tak zostanie ,dopóki nie wczytasz kolejnych danych i wskaźnik pliku nie przejdzie do początku następnej linii , wtedy powinna zwrócić false itd.
Nie używałem tej funkcji ale tak by to chyba wyglądało .
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Kod: Zaznacz cały

   int handle = FileOpen("pos.csv",FILE_CSV|FILE_READ,",");
   
   int records=0;
   while(!FileIsLineEnding(handle))
      {
         string tmp=FileReadString(handle);
         records++;
      }
   FileClose(handle);
   
   ArrayResize(Long,records);
   ArrayResize(Short,records);
   ArrayResize(Price,records);
   ////////////////////////////////////////////////////////////////////
   handle = FileOpen("pos.csv",FILE_CSV|FILE_READ,",");
   
   int i=0;
   while(!FileIsLineEnding(handle) || FileIsEnding(handle))
      {
         tmp=FileReadString(handle);
         if(tmp==""){break;}
         Alert("Long:"+i+":",tmp);
         Long[i]=StrToDouble(tmp);
         i++;
      }
      

   i=0;
   tmp=FileReadString(handle);
   while(!FileIsLineEnding(handle) || FileIsEnding(handle))
      {
         Alert("Price:"+i+":",tmp);
         Price[i]=StrToDouble(tmp);
         i++;
         tmp=FileReadString(handle);
      }
      
   i=0;
   tmp=FileReadString(handle);
   while(!FileIsLineEnding(handle) || FileIsEnding(handle))
      {
         Alert("Short:"+i+":",tmp);
         Short[i]=StrToDouble(tmp);
         tmp=FileReadString(handle);
         i++;
      }
      
   FileClose(handle);
Plik z danymi to trzy linie liczb.
Pierwsza tablice wczytuje Ok. Na drugich program wpada w nieskończoną pętlę lub jeśli nie dam wczytywania przed pętla nie wchodzi wcale.

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

Esco

nie wglebiam sie w sens kodu ale dlaczego nie dasz jak w pierszej petli break??

pozdrawiam
Andrzej Pierz

Dodano po 2 minutach:

pozatym nie powinno byc :

!FileIsEnding(handle)

??
z poważaniem
Andrzej Pierz
FOREX-SERVICE

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

bool FileIsEnding( int handle)

Returns logical true if file pointer is at the end of the file, otherwise returns false.

Po przeczytaniu jednej linijki ,musisz dać wczytanie przed kolejną pętlą , aby przesunąć wskaźnik pliku który zostaje ustawiony na koniec linii inaczej funkcja FileIsLineEnding(handle) ponownie zwróci true - zanegowane czyli false i nie wejdziesz w kolejną pętlę .

Brak chyba w MQL :

Kod: Zaznacz cały

   do{
     }while(warunek);
Nie spiesz się , zawsze zdążysz stracić .

Awatar użytkownika
Esco
Przyjaciel Forum
Przyjaciel Forum
Posty: 2603
Rejestracja: 11 kwie 2010, 20:56

Nieprzeczytany post autor: Esco »

Pierz Andrzej pisze: nie wglebiam sie w sens kodu ale dlaczego nie dasz jak w pierszej petli break??
Dałem break i zmienilem warunek w pętli z || na && i dodałem negacje przez FileisEnding.

dulf pisze: Po przeczytaniu jednej linijki ,musisz dać wczytanie przed kolejną pętlą , aby przesunąć wskaźnik pliku który zostaje ustawiony na koniec linii inaczej funkcja FileIsLineEnding(handle) ponownie zwróci true - zanegowane czyli false i nie wejdziesz w kolejną pętlę .
Tak dzięki.

ODPOWIEDZ