Печать в файл полученных данных одной строкой

 

Можно ли нижний код заменить функцией в одну строку. Сходу не пойму как обратно из текстового получить исходное с переменными.

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

"var1," [i]= ",i," NbXt[i]= ",NbXt[i]," Xt[i]= ",Xt[i]," xnXt[i]= ", xnXt[i],
        " RXt[i]= ",RXt[i],"mx= ",mx," mn= ",mn," m= ",m," VTrend[i] ",VTrend[i]"


 Qnt_Symb2=FileWrite(Handle2,var1," [i]= ",i," NbXt[i]= ",NbXt[i]," Xt[i]= ",Xt[i]," xnXt[i]= ", xnXt[i],
        " RXt[i]= ",RXt[i],"mx= ",mx," mn= ",mn," m= ",m," VTrend[i] ",VTrend[i]
        );//Запись в файл

   if(Qnt_Symb2<0) // Если не получилось
     {
      Alert("Ошибка записи в файл ",GetLastError());// Сообщение
     }; 

Поиск не помог. В общем вопрос, это возможно в MQL или нет. 

 
Valeriy Yastremskiy:

Можно ли нижний код заменить функцией в одну строку. Сходу не пойму как обратно из текстового получить исходное с переменными.

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


Поиск не помог. В общем вопрос, это возможно в MQL или нет. 

и никто ничего не понял.

что надо-то в итоге ?

если читать данные из файла, то штатных способов 3:

- читать текст и всё самому парсить

- читать CSV и разбирать какое поле куда

- открыть SQLite и забрать оттуда. Но если кто-то любезно туда записал

 
Maxim Kuznetsov:

и никто ничего не понял.

что надо-то в итоге ?

если читать данные из файла, то штатных способов 3:

- читать текст и всё самому парсить

- читать CSV и разбирать какое поле куда

- открыть SQLite и забрать оттуда. Но если кто-то любезно туда записал

Нужна только запись в  CSV файл. 

Нижний код заменить на 

FuncPrintFile(Handle2,var1," [i]= ",i," NbXt[i]= ",NbXt[i]," Xt[i]= ",Xt[i]," xnXt[i]= ", xnXt[i],
        " RXt[i]= ",RXt[i],"mx= ",mx," mn= ",mn," m= ",m," VTrend[i] ",VTrend[i])

И что бы в функции проверка результата записи производилась. При этом текст и аргументы могут быть произвольными. Или хотя бы без хендла, одни аргументы с текстом.

 
Valeriy Yastremskiy:

 При этом текст и аргументы могут быть произвольными. 

в C++ / MQL нельзя создать функцию с произвольным количеством аргументов

думаю, Вы просто хотите передавать строку ( string ), тогда Вам просто нужно разобраться как преобразовывать double / int  в строку

Valeriy Yastremskiy:

Или хотя бы без хендла, одни аргументы с текстом.

Вы можете при вызове функции использовать проверку переменной хранящей хендл с модификатором static - если значение меньше нуля, то открыть файл.... в общем можно рассуждать об алгоритме, но проще научиться пользоваться готовыми классами из СБ - CFile или CFileTxt 

https://www.mql5.com/ru/docs/standardlibrary/fileoperations

или были статьи по работе с файлами - поиском поищите

 
Igor Makanu:

в C++ / MQL нельзя создать функцию с произвольным количеством аргументов

думаю, Вы просто хотите передавать строку ( string ), тогда Вам просто нужно разобраться как преобразовывать double / int  в строку

Вы можете при вызове функции использовать проверку переменной хранящей хендл с модификатором static - если значение меньше нуля, то открыть файл.... в общем можно рассуждать об алгоритме, но проще научиться пользоваться готовыми классами из СБ - CFile или CFileTxt 

https://www.mql5.com/ru/docs/standardlibrary/fileoperations

или были статьи по работе с файлами - поиском поищите

всегда можно извратиться и нафигачить код который съест подобное :

myCSV << double_value_1 << int_value_2 << ( myCSV.Column(7)="the_string") << myCSV.EndOfRecord;

 
Igor Makanu:

в C++ / MQL нельзя создать функцию с произвольным количеством аргументов

думаю, Вы просто хотите передавать строку ( string ), тогда Вам просто нужно разобраться как преобразовывать double / int  в строку

Вы можете при вызове функции использовать проверку переменной хранящей хендл с модификатором static - если значение меньше нуля, то открыть файл.... в общем можно рассуждать об алгоритме, но проще научиться пользоваться готовыми классами из СБ - CFile или CFileTxt 

https://www.mql5.com/ru/docs/standardlibrary/fileoperations

или были статьи по работе с файлами - поиском поищите

Спасибо, классы посмотрю и впредь постараюсь не спешить с неподготовленными вопросами.

Maxim Kuznetsov:

всегда можно извратиться и нафигачить код который съест подобное :

myCSV << double_value_1 << int_value_2 << ( myCSV.Column(7)="the_string") << myCSV.EndOfRecord;

Спасибо, но не понял, как применить побитовые операции.

Вопрос возник из свойств функций Alert, Print, FileWrite. В них может быть до 63 параметров через запятую. Возможно ли пользовательская функция с такими свойствами.

#property strict

int Handle;                               // Файловый описатель
uint Qnt_Symb;                           // Количество записанных симв.
string File_Name="NameFile.csv";        // Имя файла
string TextFile;                       // строка записи в файл//
int a = 5; 
double b = 6.0;

int OnInit()
  {
    FileOpenF(); // Открываем файл
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   FileClose( Handle ); // Закрываем файл
  }

void OnTick()
  {
// Реализация записи сейчас
Qnt_Symb=FileWrite(Handle," a= ",a," b= ",b );   //Запись в файл

   if(Qnt_Symb<=0) // Если не получилось
     {
      Alert("Ошибка записи в файл ",GetLastError());// Сообщение
     };
 // Как хотелось бы
 TextFile=" ' a= ',a,' b= ',b "; // Но это не вариант, запишет как есть. Возможно дефайны помогут?
 FileWriteF(TextFile);
 
  }
    
//+------------------------------------------------------------------+
int FileOpenF()
  {
   Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,";");//Открытие файла
   if(Handle==-1) // Неудача при открытии файла
     {
      Alert("Ошибка при открытии файла. ",// Сообщение об ошибке 
            "Возможно, файл занят другим приложением");
     }
   return(Handle);
  }
  
uint FileWriteF(string TextFiles)
{
Qnt_Symb=FileWrite(Handle,TextFiles );   //Запись в файл

   if(Qnt_Symb<=0) // Если не получилось
     {
      Alert("Ошибка записи в файл ",GetLastError());// Сообщение
     };
return Qnt_Symb;
}
 
Valeriy Yastremskiy:

Вопрос возник из свойств функций Alert, Print, FileWrite. В них может быть до 63 параметров через запятую. Возможно ли пользовательская функция с такими свойствами.

Конечно:

void MyFunc(string sValue1, string sValue2 = "", string sValue3 = "", string sValue4 = "", ..., string sValue63 = "")
{
}
Вместо многоточия нужно вставить описание всех аргументов функции.
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 
Valeriy Yastremskiy:

Спасибо, классы посмотрю и впредь постараюсь не спешить с неподготовленными вопросами.

Спасибо, но не понял, как применить побитовые операции.

Вопрос возник из свойств функций Alert, Print, FileWrite. В них может быть до 63 параметров через запятую. Возможно ли пользовательская функция с такими свойствами.

class CSomeClass{
...
CSomeClass* const operator << (Type param) {DoSomething(param); return &this;}
...
};
 
Ihor Herasko:

Конечно:

Вместо многоточия нужно вставить описание всех аргументов функции.

Спасибо))) , да мы же можем указать максимальное число параметров, а вводить не все параметры))) Да и в тип текст приводить необязательно,если известно расположение параметров по типам. Хотя числовые не введенные параметры будут нули печатать, тогда лучше привести все параметры к текстовому типу.

Vladimir Simakov:

Не дорос еще видимо)))) Но все равно спасибо))

 

Ну количество запятых контролить пустых записей и кавычки ставить. А так, на ура работает) Эх, проще надо быть)))))

результат  a= ;5; b= ;6

#property strict

int Handle;// Файловый описатель
uint Qnt_Symb;                           // Количество записанных симв.
string File_Name="NameFile.csv";        // Имя файла
int a = 5; 
double b = 6.0;

int OnInit()
  {
    FileOpenF();
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   FileClose( Handle );
  }

void OnTick()
  {
 FileWriteF(" a= ",string (a)," b= ",string (b),"","");
   }
  
  
//+------------------------------------------------------------------+
int FileOpenF()
  {
   Handle=FileOpen(File_Name,FILE_CSV|FILE_WRITE,";");//Открытие файла
   if(Handle==-1) // Неудача при открытии файла
     {
      Alert("Ошибка при открытии файла. ",// Сообщение об ошибке 
            "Возможно, файл занят другим приложением");
     }
   return(Handle);
  }
  
uint FileWriteF(string Val1,string Val2,string Val3,string Val4,string Val5,string Val6)
{
Qnt_Symb=FileWrite(Handle,Val1, Val2, Val3, Val4, Val5, Val6 );   //Запись в файл

   if(Qnt_Symb<=0) // Если не получилось
     {
      Alert("Ошибка записи в файл ",GetLastError());// Сообщение
     };
return Qnt_Symb;
}
 
Valeriy Yastremskiy:

Да предопределенные переменные сразу не заметил, если они предопределены, то их количество можно не контролировать)))) А ведь все было написано)

uint FileWriteF(string Val1="",string Val2="",string Val3="",string Val4="",string Val5="",string Val6="")
{....}
Причина обращения: