Не получается прочитать строчки из файла через FileReadString. Что делаю не так?

 

Прилагаю к посту простой текстовый файл, такой, какой есть. Вроде, обычный текстовый файл. Но не могу из него прочитать строчки через FileReadString:

handle = FileOpen(FileName, FILE_CSV|FILE_READ);

// FileSeek(handle, 0, SEEK_CUR); // экспериментировал
Str = FileReadString(handle);

С другими файлами, вроде, работает, с этим - нет.

Файлы:
test.txt  1 kb
 
mql4com писал(а) >>

Прилагаю к посту простой текстовый файл, такой, какой есть. Вроде, обычный текстовый файл. Но не могу из него прочитать строчки через FileReadString:

С другими файлами, вроде, работает, с этим - нет.

так у меня читает текстовый файл !

  pHandle = FileOpen(pFileName,FILE_READ);
  if(pHandle > -1)
  {
    while(!FileIsEnding(pHandle))
    {
      pStr="";
      pStrSub="";
      pi=0;
      pStrFile = FileReadString(pHandle);
также проверь имя файла, месторасположение, что хендл кажет и какие ошибки в журнале!
 
Файл может в юникоде написан?
 
https://docs.mql4.com/ru/files/FileOpen: "Знак разделителя для csv-файлов. По умолчанию применяется символ ';'."

https://docs.mql4.com/ru/files/FileReadString: "Для текстовых файлов строка будет прочитана до разделителя."

https://docs.mql4.com/ru/basis/types/string: "Длина строковой константы - от 0 до 255 символов."


То есть, как я понимаю то, что написано в доке сейчас, в строку должен был попытаться загрузиться весь файл, который больше 255 символов, нет?

 

Вот полный код скрипта:

void start()
{
  int handle;
  string Str;
  
  handle = FileOpen("test.txt", FILE_CSV|FILE_READ);
  Str = FileReadString(handle);
//  FileSeek(handle, 0, SEEK_CUR);
  Str = FileReadString(handle);
  
  Print(Str);
  
  FileClose(handle);
  return;
}

С чтением первой строчки нет проблем. Но вторую (третью тоже) прочитать не удается (пустая строка).

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

Посмотрел побайтово проблемный файл:

в нем в конце строки стоят два байта в такой последовательности: 0x0A (перевод каретки) и 0x0D (перевод строки).

У файлов, записанных через FileWriteString в конце строк последовательность байт немного иная: 0x0D и 0x0A - с ними скрипт работает без проблем.

Текстовые редакторы видят файлы обоих вариантов без проблем, однако, для FileReadString это не так. Возоможно, у кого-то есть мысли, как обойти ограничение средствами MQL4.

 
Извращенный вариант -- пропускать файл через фильтр, который переставит эти байты. Или научить ту приблуду, что создала файл, правильно его создавать.
 

Похоже, проблема глубже, чем с первого взгляда показалась. Взял другой файл, с той же последовательностью (0x0A и 0x0D) в конце каждой строки, как и у предыдущего файла.

Код выше с раскомментированной строчкой на нем работает! Тогда написал код немного иной:

void start()
{
  int handle;
  string Str;
  
  handle = FileOpen("testNew.txt", FILE_READ);
  Str = FileReadString(handle);
  
  while (StringLen(Str) > 10)
  {
    FileSeek(handle, 0, SEEK_CUR); // без этой строки по какой-то причине не работает
    Str = FileReadString(handle);
    Print(Str);
  }
  
  FileClose(handle);
  return;
}
Считываются строчки. Но только до 9-й с конца, т.е. считывает первые 847 строк, дальше никак! Проверил файл побайтово - все нормально.
Файлы:
testnew.txt  47 kb
Причина обращения: