//+------------------------------------------------------------------------------------------------------------------+
//| ZI_File_Functions_Full_Double_Data_Lib 0-81024.mq4|
//| Copyright © Zhunko |
//| ZHUNKO vadim@zhunko.ru |
//|24.10.2008 Ilnur X-79@yandex.ru |
//+------------------------------------------------------------------------------------------------------------------+
//| Îïåðàöèè äëÿ áèíàðíîãî ôàéëà äàííûõ äâîéíîé òî÷íîñòè. |
//+------------------------------------------------------------------------------------------------------------------+
//| 1. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà äàííûõ äâîéíîé òî÷íîñòè". |
//| 2. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ìàññèâà äàííûõ äâîéíîé òî÷íîñòè". |
//| 3. Ôóíêöèÿ çàïèñûâàåò ÷èñëî äâîéíîé òî÷íîñòè â äâîè÷íûé ôàéë. |
//| 4. Ôóíêöèÿ ÷èòàåò ÷èñëî äâîéíîé òî÷íîñòè èç òåêóùåé ïîçèöèè áèíàðíîãî ôàéëà. |
//| 5. Ôóíêöèÿ âîçâðàùàåò ñòðîêîâîå îïèñàíèå êîäà ñèñòåìíîé îøèáêè. |
//+------------------------------------------------------------------------------------------------------------------+
#property copyright "Copyright © 2008 Zhunko, Ilnur"
#property link "vadim@zhunko.ru ; X-79@yandex.ru"
#property library
// Èìïîðòèðóåìûå ôóíêöèè.
#import "kernel32.dll"
bool ReadFile (int hFile, double& lpBuffer[], int nNumberOfBytesToRead, int& lpNumberOfBytesRead[], int lpOverlapped);
bool WriteFile (int hFile, double lpBuffer[], int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten[], int lpOverlapped);
void RtlMoveMemory (double& Destination[], double Source[], int Length);
#import "ntdll.dll"
int RtlGetLastWin32Error();
int RtlSetLastWin32Error (int dwErrCode);
#import
#include <WinKernel32.mqh> // Çàãîëîâî÷íûé ôàéë áèáëèîòåêè "kernel32.dll" ôóíêöèé API Windows XP.
//=================================================================================================================================================================================
// 1. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà äàííûõ äâîéíîé òî÷íîñòè".==============================================================================================================
//  ðåæèìå ñîçäàíèÿ è çàïèñè âîçâpàùàåò ÷èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.  ñëó÷àå íåóñïåøíîãî çàâåpøåíèÿ ôóíêöèÿ âîçâðàùàåò "-1".
//  ðåæèìå ÷òåíèÿ âîçâðàùàåò ïðî÷èòàííîå çíà÷åíèå.
double FileOperationsDoubleValue (string PathName, // Íàçâàíèå ôàéëà.
double& Value, // Ïåðåìåííàÿ äëÿ çàïèñè èëè ÷òåíèÿ.
int Size, // Ôëàã ôîðìàòà: DOUBLE_VALUE (8 áàéòîâ);
// FLOAT_VALUE (4 áàéòà).
int ModeCWR, // Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì: 0 - FILE_CREATE_ ñîçäàòü èëè ïåðåïèñàòü ôàéë;
// 1 - FILE_WRITE_ äîïèñàòü ôàéë;
// 2 - FILE_READ_ ÷èòàòü ôàéë.
int Offset, // Ñìåùåíèå â áàéòàõ ôàéëîâîãî óêàçàòåëÿ.
int Origin, // Íà÷àëüíîå ïîëîæåíèå ôàéëîâîãî óêàçàòåëÿ: SEEK_CUR - îò òåêóùåãî ïîëîæåíèÿ,
// SEEK_SET - îò íà÷àëà,
// SEEK_END - îò êîíöà ôàéëà).
int& ArOutputByte[]) // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
int Handle; // Ñèñòåìíûé äåñêðèïòîð ôàéëà.
int i;
//----
double ArBuffer[1] = {0}; // Áóôåð äëÿ çàïèñè èëè ÷òåíèÿ.
//----
ArrayResize (ArOutputByte, 1);
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
switch (ModeCWR)
{
case 0: Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); break; // Ñîçäà¸ì ôàéë.
case 1: Handle = CreateFileA (PathName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // Äîïèñûâàåì ôàéë.
case 2: Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // ×èòàåì ôàéë.
default: Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì ñ ïóò¸ì \"", PathName, "\" âûáðàí íå âåðíî. ModeCWR = ", ModeCWR); return (-1);
}
if (Handle == -1) // Åñëè ôàéë íå îòêðûò.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå îòêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
if (SetFilePointer (Handle, Offset, NULL, Origin) == -1) // Åñëè ôàéë îòêðûò, ñäâèãàåì ôàéëîâûé óêàçàòåëü, êóäà òðåáóåòñÿ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Ôàéëîâûé óêàçàòåëü ôàéëà ñ ïóò¸ì \"", PathName, "\" íå ñìåù¸í. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (CloseHandle (Handle) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
return (-1);
}
switch (ModeCWR)
{
case 0: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
case 1: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
{
ArBuffer[0] = Value;
if (WriteFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
break;
}
case 2: // ×èòàåì èç ôàéëà çíà÷åíèå.
{
if (ReadFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
else Value = ArBuffer[0];
break;
}
}
if (CloseHandle (Handle) == false) // Çàêðûâàåì ôàéë.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleValue()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
switch (ModeCWR)
{
case 0: return (ArOutputByte[0]); // Âîçâðàùàåì êîëè÷åñòâî çàïèñàííûõ áàéò.
case 1: return (ArOutputByte[0]); // Âîçâðàùàåì êîëè÷åñòâî çàïèñàííûõ áàéò.
case 2: return (ArBuffer[0]); // Âîçâðàùàåì ïðî÷èòàííîå çíà÷åíèå.
}
}
//=================================================================================================================================================================================
// 2. Ôóíêöèÿ "Îïåðàöèè äëÿ áèíàðíîãî ôàéëà ìàññèâà äàííûõ äâîéíîé òî÷íîñòè".======================================================================================================
// Âîçâpàùàåò ÷èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ ýëåìåíòîâ.  ñëó÷àå íåóñïåøíîãî çàâåpøåíèÿ ôóíêöèÿ âîçâðàùàåò "-1".
int FileOperationsDoubleArray (string PathName, // Íàçâàíèå ôàéëà.
double& Array[], // Ìàññèâ äëÿ çàïèñè èëè ÷òåíèÿ.
int ModeCWR, // Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì: 0 - FILE_CREATE_ ñîçäàòü èëè ïåðåïèñàòü ôàéë;
// 1 - FILE_WRITE_ äîïèñàòü ôàéë;
// 2 - FILE_READ_ ÷èòàòü ôàéë.
int Start, // Ñòàðòîâàÿ ïîçèöèÿ äëÿ çàïèñè â ìàññèâ èëè ÷òåíèÿ èç ìàññèâà.
int Count, // Êîëè÷åñòâî ýëåìåíòîâ äëÿ çàïèñè èëè ÷òåíèÿ ñ ó÷¸òîì âñåõ èçìåðåíèé.
int Offset, // Ñìåùåíèå â áàéòàõ ôàéëîâîãî óêàçàòåëÿ.
int Origin) // Íà÷àëüíîå ïîëîæåíèå ôàéëîâîãî óêàçàòåëÿ: SEEK_CUR - îò òåêóùåãî ïîëîæåíèÿ,
// SEEK_SET - îò íà÷àëà,
// SEEK_END - îò êîíöà ôàéëà).
{
int Bytes = 4 * Count; // Êîëè÷åñòâî çàïèñûâàåìûõ áàéò.
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
int Handle; // Ñèñòåìíûé äåñêðèïòîð ôàéëà.
int i;
int Size; // Ðàçìåð ìàññèâà.
//----
double ArTemp1[]; // Òåõíè÷åñêèé ìàññèâ.
double ArTemp2[]; // Òåõíè÷åñêèé ìàññèâ.
int ArOutputByte[1]; // Áóôåð äëÿ âîçâðàòà ÷èñëà çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
switch (ModeCWR)
{
case 0: Handle = CreateFileA (PathName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); break; // Ñîçäà¸ì ôàéë.
case 1: Handle = CreateFileA (PathName, GENERIC_WRITE|GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // Äîïèñûâàåì ôàéë.
case 2: Handle = CreateFileA (PathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); break; // ×èòàåì ôàéë.
default: Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Òèï ïðîèçâîäèìûõ äåéñòâèé ñ ôàéëîì ñ ïóò¸ì \"", PathName, "\" âûáðàí íå âåðíî. ModeCWR = ", ModeCWR); return (-1);
}
if (Handle == -1) // Åñëè ôàéë íå îòêðûò.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå îòêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
if (SetFilePointer (Handle, Offset, NULL, Origin) == -1) // Åñëè ôàéë îòêðûò, ñäâèãàåì ôàéëîâûé óêàçàòåëü, êóäà òðåáóåòñÿ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Ôàéëîâûé óêàçàòåëü ôàéëà ñ ïóò¸ì \"", PathName, "\" íå ñìåù¸í. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (CloseHandle (Handle) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
return (-1);
}
switch (ModeCWR)
{
case 0: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
case 1: // Çàïèñûâàåì èëè äîïèñûâàåì â ôàéë âõîäíîå çíà÷åíèå.
{
Size = ArraySize (Array); // Ðàçìåð âõîäíîãî ìàññèâà.
ArrayResize (ArTemp1, Size); // Èçìåíÿåì ðàçìåð òåõíè÷åñêîãî ìàññèâà ïîä ðàçìåð âõîäíîãî ìàññèâà.
RtlMoveMemory (ArTemp1, Array, Size); // Êîïèðóåì âõîäíîé ìíîãîìåðíûé ìàññèâ â îäíîìåðíûé òåõíè÷åñêèé ìàññèâ.
if (Start != 0) ArrayCopy (ArTemp1, ArTemp1, 0, Start, Count); // Ïåðåãîíÿåì çàïèñûâàåìûå ýëåìåíòû â íà÷àëî ìàññèâà.
if (WriteFile (Handle, Array, Bytes, ArOutputByte, NULL) == false) // Çàïèñûâàåì â ôàéë óêàçàííîå êîëè÷åñòâî ýëåìåíòîâ.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
break;
}
case 2: // ×èòàåì èç ôàéëà çíà÷åíèå.
{
if (ReadFile (Handle, Array, Bytes, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Çíà÷åíèå â ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
}
Size = ArraySize (Array); // Ðàçìåð âõîäíîãî ìàññèâà.
if (Size < (Start + Count)) Count = Size - Start; // Îïðåäåëÿåì êîëè÷åñòâî êîïèðóåìûõ ýëåìåíòîâ â ñëó÷àå íåäîñòàòî÷íîñòè ðàçìåðà ìàññèâà ïðè¸ìíèêà.
if (Start == 0) RtlMoveMemory (Array, ArTemp1, Size); // Åñëè ñòàðòîâàÿ ïîçèöèÿ ðàâíà íóëþ, òî êîïèðóåì îäíîìåðíûé òåõíè÷åñêèé ìàññèâ â âûõîäíîé ìíîãîìåðíûé ìàññèâ ñðàçó.
else // Åñëè ñòàðòîâàÿ ïîçèöèÿ íå ðàâíà íóëþ.
{
ArrayResize (ArTemp2, Size); // Èçìåíÿåì ðàçìåð âòîðîãî òåõíè÷åñêîãî ìàññèâà ïîä ðàçìåð âõîäíîãî ìàññèâà.
RtlMoveMemory (ArTemp2, Array, Size); // Êîïèðóåì âõîäíîé ìíîãîìåðíûé ìàññèâ â îäíîìåðíûé âòîðîé òåõíè÷åñêèé ìàññèâ. Ñîçäà¸ì îáðàç âõîäíîãî ìàññèâà.
ArrayCopy (ArTemp2, ArTemp1, Start, 0, Count); // Ïåðåãîíÿåì ÷èòàåìûå ýëåìåíòû â óêàçàííîå ìåñòî âòîðîãî òåõíè÷åñêîãî ìàññèâà (îáðàçà âûõîäíîãî ìàññèâà).
RtlMoveMemory (Array, ArTemp2, Size); // Êîïèðóåì îäíîìåðíûé âòîðîé òåõíè÷åñêèé ìàññèâ â âûõîäíîé ìíîãîìåðíûé ìàññèâ.
ArrayResize (ArTemp2, 0); // Óíè÷òîæàåì âòîðîé òåõíè÷åñêèé ìàññèâ.
}
break;
}
}
if (CloseHandle (Handle) == false) // Çàêðûâàåì ôàéë.
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileOperationsDoubleArray()\". Ôàéë ñ ïóò¸ì \"", PathName, "\" íå çàêðûò. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
ArrayResize (ArTemp1, 0); // Óíè÷òîæàåì ìàññèâ.
return (ArOutputByte[0] / 8);
}
//=================================================================================================================================================================================
// 3. Ôóíêöèÿ çàïèñûâàåò ÷èñëî äâîéíîé òî÷íîñòè â äâîè÷íûé ôàéë.===================================================================================================================
// Âîçâðàùàåò ôàêòè÷åñêè çàïèñàííîå ÷èñëî áàéò èëè îòðèöàòåëüíîå çíà÷åíèå â ñëó÷àå îøèáêè.
int FileWriteDoubleFull (int Handle, // Ôàéëîâûé îïèñàòåëü, âîçâðàùàåìûé ôóíêöèåé "FileOpenFull()".
double Value, // Çíà÷åíèå äâîéíîé òî÷íîñòè.
int Size) // Ôëàã ôîðìàòà: DOUBLE_VALUE (8 áàéòîâ);
// FLOAT_VALUE (4 áàéòà).
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
//----
double ArBuffer[1] = {0}; // Áóôåð äëÿ çàïèñè èëè ÷òåíèÿ.
int ArOutputByte[1]; // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
ArBuffer[0] = Value;
if (WriteFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileWriteDoubleFull()\". Çíà÷åíèå â ôàéë íå çàïèñàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (-1);
}
else return (ArOutputByte[0]);
}
//=================================================================================================================================================================================
// 4. Ôóíêöèÿ ÷èòàåò ÷èñëî äâîéíîé òî÷íîñòè èç òåêóùåé ïîçèöèè áèíàðíîãî ôàéëà.====================================================================================================
double FileReadDoubleFull (int Handle, // Ôàéëîâûé îïèñàòåëü, âîçâðàùàåìûé ôóíêöèåé "FileOpenFull()".
int Size) // Ôëàã ôîðìàòà: DOUBLE_VALUE (8 áàéòîâ);
// FLOAT_VALUE (4 áàéòà).
{
int Error; // Íîìåð ïîñëåäíåé îøèáêè.
//----
double ArBuffer[1] = {0}; // Áóôåð äëÿ çàïèñè èëè ÷òåíèÿ.
int ArOutputByte[1]; // ×èñëî çàïèñàííûõ èëè ïðî÷èòàííûõ áàéò.
//----
RtlSetLastWin32Error (0); // Ñáðàñûâàåì îøèáêè.
if (ReadFile (Handle, ArBuffer, Size, ArOutputByte, NULL) == false)
{
Error = RtlGetLastWin32Error();
Print ("Îøèáêà â ôóíêöèè \"FileReadDoubleFull()\". Çíà÷åíèå èç ôàéëà íå ïðî÷èòàíî. Ïîñëåäíÿÿ îøèáêà: \"", Error, "\". ", StringError (Error));
return (0);
}
else return (ArBuffer[0]);
}
//=================================================================================================================================================================================
// 5. Ôóíêöèÿ âîçâðàùàåò ñòðîêîâîå îïèñàíèå êîäà ñèñòåìíîé îøèáêè.=================================================================================================================
string StringError (int ErrorCode)
{
int i;
string String = "";
//----
int Buffer[128];
//----
ArrayInitialize (Buffer, 0);
FormatMessageA (0x1000, 0, ErrorCode, 0, Buffer, ArraySize (Buffer), 0);
//----
for (i = 0; i < ArraySize (Buffer); i++)
{
String = String + CharToStr (Buffer[i] & 0xFF)
+ CharToStr (Buffer[i] >> 8 & 0xFF)
+ CharToStr (Buffer[i] >> 16 & 0xFF)
+ CharToStr (Buffer[i] >> 24 & 0xFF);
}
return (StringTrimRight (String) + ".");
}
//=================================================================================================================================================================================
//æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ
Comments