считывание строки из файла FileReadString(filehandle)

 

Всем привет !

стандартной функцией считываю строку из файла: word1 = FileReadString(filehandle); Это наименование инструмента. 

затем при сравнение этого значение в цикле мне даёт разную длину строки , то есть  если word1  = "EURUSD" а длина строки  равно то 6 то 7 то 8 символов (приложено в картинке) 

в чем дело ? не понятно

соответственно в цикле не корректен результат  сравнения ...

 
Yerkin Sagandykov:

Всем привет !

стандартной функцией считываю строку из файла: word1 = FileReadString(filehandle); Это наименование инструмента. 

затем при сравнение этого значение в цикле мне даёт разную длину строки , то есть  если word1  = "EURUSD" а длина строки  равно то 6 то 7 то 8 символов (приложено в картинке) 

в чем дело ?

соответственно в цикле не корректен результат  сравнения ...

Код, как всегда, секретен, а мы экстрасенсы. 

 
Yerkin Sagandykov:

Всем привет !

стандартной функцией считываю строку из файла: word1 = FileReadString(filehandle); Это наименование инструмента. 

затем при сравнение этого значение в цикле мне даёт разную длину строки , то есть  если word1  = "EURUSD" а длина строки  равно то 6 то 7 то 8 символов (приложено в картинке) 

в чем дело ?

соответственно в цикле не корректен результат  сравнения ...

на правах мастера телепатического восприятия: уберите из параметров FileOpen : FILE_CSV

 

рад что дал повод веселью )

подумал что не суть в коде . хотел обратить внимание  на картинке - сравнивается переменные symb и word1, и  почему тип значения у symb "string &" ? и длина визуально у  word1 = 6, но показывает = lenght = 8 (а бывает что = 7 или 6)

void fileRe_Write(string symb)
{
   int filehandle1=FileOpen("signalCrossRed_.csv",FILE_CSV | FILE_READ | FILE_WRITE,";");
   if(filehandle1==INVALID_HANDLE) {Print("Операция FileRe_Write signalCrossRed_.csv, ошибка ",GetLastError()); return ;}     
   
   string word1 , word2;  
   FileSeek(filehandle,0,SEEK_SET);
   while(!FileIsEnding(filehandle)) 
     { 
      //--- прочитаем строку 
         word1 = FileReadString(filehandle);
         word2 = FileReadString(filehandle);
         
         if (word1 != symb) {
            FileWrite(filehandle1,word1, word2); 
         }
     }
   FileClose(filehandle);   
   FileClose(filehandle1);  
   
   FileCopy("signalCrossRed_.csv",0,"signalCrossRed.csv",FILE_REWRITE);
   FileDelete("signalCrossRed_.csv");
   
   filehandle=FileOpen("signalCrossRed.csv",FILE_CSV | FILE_READ | FILE_WRITE ,";");
   if (filehandle==INVALID_HANDLE) {Print("Операция__ FileRe_Write signalCrossRed.csv, ошибка ",GetLastError()); return ;}  

}
 
Maxim Kuznetsov #:

на правах мастера телепатического восприятия: уберите из параметров FileOpen : FILE_CSV

это не помогло ....

 
Взять ту строку с "неправильной" длиной и пройти по ней циклом с StringGetCharacter, посмотреть конкретно, в какой позиции какой символ.
 
// флаги функции FileOpen
#define FILE_READ_UTF8 (int)(FILE_SHARE_READ|FILE_ANSI)
#define FILE_WRITE_UTF8 (int)(FILE_READ|FILE_WRITE|FILE_ANSI)
#define FILE_READ_UNICODE (int)(FILE_SHARE_READ|FILE_UNICODE)
#define FILE_WRITE_UNICODE (int)(FILE_READ|FILE_WRITE|FILE_UNICODE)

// -----------------------------------------------------------------------------
// Загрузить текстовый файл
// -----------------------------------------------------------------------------
static string UFile::LoadText(string path, int flags, CArrayString *lines = NULL) {
    
    string sdlm = "";
    string line, text;
    
    // загружаем текст по-строчно
    ResetLastError();
    uint codePage = (flags == FILE_READ_UNICODE) ? CP_ACP : CP_UTF8;
    if (MQLInfoInteger(MQL_TESTER)) flags |= FILE_COMMON;
    int file = FileOpen(path, flags, '\n', codePage);
    if(file != INVALID_HANDLE) {
        text = "";
        while(!FileIsEnding(file)) {
            line = FileReadString(file);
            if (lines != NULL) lines.Add(line);
            text += sdlm + line;
            sdlm = "\n";
        }
        FileClose(file);
    }
    
    // проверяем код ошибки
    int rcode = GetLastError();
    if (rcode != ERR_SUCCESS) {
        PrintFormat("%s / ERROR: %i / %s", __FUNCTION__, rcode, path);
    }
    
    return text;
}

// -----------------------------------------------------------------------------
// Сохранить текстовый файл (по умолчанию в UTF-8 с добавлением в конец файла)
// -----------------------------------------------------------------------------
static bool UFile::SaveText(string text, string path, 
    int flags = FILE_WRITE_UTF8, bool reset = false) {

    // если текст нужно переписать, то удаляем файл
    if (reset && FileIsExist(path)) FileDelete(path);

    // сохраняем текст
    ResetLastError();
    uint codePage = (flags == FILE_WRITE_UNICODE) ? CP_ACP : CP_UTF8;
    if (MQLInfoInteger(MQL_TESTER)) flags |= FILE_COMMON;
    int file = FileOpen(path, flags, '\t', codePage);
    if(file != INVALID_HANDLE && FileSeek(file, 0, SEEK_END)) {
        FileWriteString(file, text);
        FileClose(file);
    }

    // проверяем код ошибки
    int rcode = GetLastError();
    if (rcode != ERR_SUCCESS) {
        PrintFormat("%s / ERROR: %i / %s", __FUNCTION__, rcode, path);
    }

    return (rcode == ERR_SUCCESS);
}
 
Yerkin Sagandykov #:

рад что дал повод веселью )

подумал что не суть в коде . хотел обратить внимание  на картинке - сравнивается переменные symb и word1, и  почему тип значения у symb "string &" ? и длина визуально у  word1 = 6, но показывает = lenght = 8 (а бывает что = 7 или 6)

такой код после запуска должен делать из файла помойку..

читает и пишет в произвольные места, заметая следы :-) его даже править бесполезно

и все прочие ошибки - производные

 
JRandomTrader #:
Взять ту строку с "неправильной" длиной и пройти по ней циклом с StringGetCharacter, посмотреть конкретно, в какой позиции какой символ.
прошелся - что за символ в начале   с кодом 65279 ? он как раз и лишний ...
 
Yerkin Sagandykov #:
прошелся - что за символ в начале   с кодом 65279 ? он как раз и лишний ...

Как я понимаю, FEFF(65279) - это признак юникода, который MT5/ME5 ставит в начале файла.

 
JRandomTrader #:

Как я понимаю, FEFF(65279) - это признак юникода, который MT5/ME5 ставит в начале файла.

понято. странно - при каких  условиях он устанавливается ? не всегда при чем , процентов 90 все нормально