Скачать MetaTrader 5

помогите с чтением из файла. - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Dik
12267
Andrey Dik  
void CsvTo2D_Array(string nameFile, string Separator, double &array[][], int &StrAmount, int &ColumnAmount, bool &truth)
{       // Обявление переменных
        int i,count,count2,lineSize;
        string varray[1000];
        // Открыть файл CSV для чтения с разделителем "Separator"
        int handle = FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);
        if (handle == 1)
        {// если файл найден, узнать количество столбцов в строке
                truth=true;
                while (i != true)
                {
                        varray[count] = FileReadString(handle);
                        i = FileIsLineEnding(handle);
                        lineSize++;
                }
                FileSeek(handle, 0, SEEK_SET);
                i = false;
                while (i != true)
                {
                        if (count2 == lineSize) // В файле истории семь позиций
                        {
                                count2 = 0;     // Если конец строки то обнуляем второй счетчик
                                count++; // Первый счетчик для распределения строк в первом массиме
                        }
                        array[count][count2] = StringToDouble(FileReadString(handle)); // Чтение строки до указателя
                        count2++;       // Второй счетчик для распределения позиций во втором массиве
                        i = FileIsEnding(handle);       // Листаем строки
                }
        }
        else
        {
                truth=false;
        }       //Alert("Файл ",nameFile," не обнаружен, последняя ошибка ", GetLastError());} // Если файл не найден вывести сообщение
        FileClose(handle); // Закрыть файл

        StrAmount    =count;            //возвращаемое значение количества найденных в файле строк
        ColumnAmount =lineSize; //возвращаемое значение количества найденных в файле столбцов
}
Victor Nikolaev
Модератор
15078
Victor Nikolaev  

А почему?

       int handle = FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);
        if (handle == 1)

Вроде нужно

       int handle = FileOpen(nameFile,FILE_CSV|FILE_READ,Separator);
        if (handle >= 0)
Andrey Dik
12267
Andrey Dik  
Vinin:

А почему?

Вроде нужно

Потому что возвращает или 1 или -1.
Vadim Zhunko
5226
Vadim Zhunko  
joo:
Потому что возвращает или 1 или -1.

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

В MQL4 в случае ошибки возвращает -1. 

Andrey Dik
12267
Andrey Dik  
Zhunko:

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

В MQL4 в случае ошибки возвращает -1.

Посмотрел справку. Похоже Вы с Виктором правы. Нужно так:
if (handle >= 0)

а ещё лучше так:

if (handle != -1)
Vadim Baklanov
4202
Vadim Baklanov  

Насколько я помню глюки лезли пока не сделал так:

if (handle > 0)
Maxim Kyzminsky
366
Maxim Kyzminsky  

Добрый день всем, начал изучать работу с файлами...разобрался как создавать, как дописывать

теперь у меня появились трудности с чтением файла (точнее сравнением полученных данных с данными в файле,проще говоря перебор строк)...

не получается даже правильно вытащить инфу с файла

в файле 3 столбца в 1м нумерация строк 1,2,3,4,5 и т.д. во 2м значения типа 101,111,110 и т.д. всегда по 3 символа, в 3м числа от 0 до 100 напротив каждого значения во втором

Как мне вытащить 2й столбец сравнить с текущим полученным значением и

1) если значения совпадают то переписать/прибавить значение в 3м т .е. было 3 стало 4, было 6 стало 7 ...на +1

2) если значения разные то дописать

из этого всего я знаю только как открыть и дописать фаил

Вот код который я слепил из материала https://book.mql4.com/ru/functions/files точнее попытался слепить, но так ничего и не получилось

 int Handle;                         // Файловый описатель

   string Instr,                       // Название валюты
          One,Two,                     // 1я и 2я чать названия инстр.
          Text,                        // Текст описания события
          Str_DtTm;                    // Дата и время события(строка)
   string Dat_DtTm;                  // Дата и время события(дата)
//--------------------------------------------------------------- 3 --
  Handle=FileOpen(Symbol()+"_"+IntegerToString(Period())+".csv",FILE_CSV|FILE_READ|FILE_WRITE,";");

//--------------------------------------------------------------- 4 --
   while(FileIsEnding(Handle)==false)  // До тех пор, пока файловый ..
     {                                 // ..указатель не в конце файла
      //--------------------------------------------------------- 5 --
      Str_DtTm =FileReadString(Handle);// Дата и время события(дата)
      Text     =FileReadString(Handle);// Текст описания события
      if(FileIsEnding(Handle)==true)   // Файловый указатель в конце
         break;                        // Выход из чтения и рисования
      //--------------------------------------------------------- 6 --
      Dat_DtTm =StringToInteger(Str_DtTm);   // Преобразование типа данных
      Instr    =StringSubstr(Text,0,3);// Извлекаем первые 3 символа
      One=StringSubstr(Symbol(),0,3);// Извлекаем первые 3 символа
      Two=StringSubstr(Symbol(),3,3);// Извлекаем вторые 3 символа
         Print(One,Two);
         FileClose( Handle );                // Закрываем файл
        }

я комментарий и переменные не менял, взял из статьи код как он и есть и хотел хотя бы в Print(); вывести читаемую строку.....

Создал отдельно тему но там никто не отвечает... https://forum.mql4.com/ru/61135#912793

Goodman
119
Goodman  
joo, спасибо! Работает и более короткий вариант: //-------------------------------------------------------------------- bool CsvTo2D_Array(string nameFile, string Separator, double &array[][], int &StrAmount, int &ColumnAmount) //-------------------------------------------------------------------- { int i,count,count2,lineSize; bool truth= false; int handle = FileOpen(nameFile,FILE_CSV|FILE_READ); if (handle >0) { truth=true; bool eof = false; while (!eof) { if (FileIsLineEnding(handle)) { count2 = 0; count++; } array[count][count2] = FileReadNumber(handle); count2++; eof = FileIsEnding(handle); } } else rerurn(false); FileClose(handle); rerurn(truth); } //--------------------------------------------------------------------
Goodman
119
Goodman  

joo,
спасибо!

Работает и более короткий вариант:

//--------------------------------------------------------------------
bool CsvTo2D_Array(string nameFile, string Separator, double &array[][], int &StrAmount, int &ColumnAmount)
//--------------------------------------------------------------------
{       
        int i,count,count2,lineSize; 
        bool truth= false;
        
        int handle = FileOpen(nameFile,FILE_CSV|FILE_READ);
        if (handle >0)
        {
                truth=true;
                bool eof = false;
                while (!eof)
                {
                        if (FileIsLineEnding(handle)) 
                        {
                                count2 = 0;     
                                count++; 
                        }
                        array[count][count2] = FileReadNumber(handle); 
                        count2++;      
                        eof = FileIsEnding(handle);      
                }
        }
        else rerurn(false);
            
        FileClose(handle); 
        rerurn(truth);
}
//--------------------------------------------------------------------
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий