Trabajar con archivos. - página 2

 
mql5:
Las cadenas en MQL son unicode (2 bytes por carácter) y las funciones de kernel32.dll son ansi (1 byte por carácter). Utilice una matriz de bytes y función StringToCharArray para llamar a las funciones ansish
¿Cómo es eso?
Si no recuerdo mal, Windows es casi totalmente Unicode, y lo ha sido durante mucho tiempo...

¿O es kernel32.dll una excepción?

-----Added------

Lo miré, realmente ansi, extraño...

 

Un consejo para un aficionado. Mis conocimientos sobre el trabajo con archivos están al nivel de un usuario de Word.

El Asesor Experto necesita sobrescribir un valor de tipo datetime en el archivo, cada vez al principio del archivo, durante todo el tiempo de su trabajo. Leer el último valor escrito - sólo al reiniciar el Asesor Experto. He hecho una construcción sencilla, utilizando el archivo .csv - todo parece funcionar. Aparecen las siguientes preguntas:

1) ¿Qué tipo de archivo es mejor utilizar para guardar los valores de fecha y hora con el fin de minimizar el tiempo del procedimiento de escritura? Según he entendido, los archivos .csv trabajan con cadenas, y donde hay cadenas, hay un consumo de tiempo adicional para su procesamiento.

2) ¿Cómo utilizar correctamente FileClose(): debo cerrar el archivo cada vez después de escribir un nuevo valor en él, o cerrarlo una vez, en la función OnDeinit()? Me gustaría abrir el archivo una vez y luego sólo escribir nuevos valores en él, sin perder tiempo en abrirlo y cerrarlo varias veces. ¿Pero es seguro hacerlo?

3) ¿Entiendo correctamente que si se escribe algún valor en el archivo, pero el archivo no se cierra, entonces en caso de un apagón repentino este valor escrito no desaparecerá, y cuando se cargue el programa, será posible leerlo después?

 

Yedelkin:

Se han planteado las siguientes preguntas:

1) ¿Qué tipo de archivo es mejor utilizar para guardar los valores de fecha y hora con el fin de minimizar el tiempo del procedimiento de escritura? Según he entendido, los archivos .csv trabajan con cadenas, y donde hay cadenas, hay un consumo de tiempo adicional para su procesamiento.

2) ¿Cómo utilizar correctamente FileClose(): debo cerrar el archivo cada vez después de escribir un nuevo valor en él, o cerrarlo una vez, en la función OnDeinit()? Me gustaría abrir el archivo una vez y luego sólo escribir nuevos valores en él, sin perder tiempo en abrirlo y cerrarlo varias veces. ¿Pero es seguro hacerlo?

3) ¿Entiendo correctamente que si se escribe algún valor en el archivo, pero el archivo no se cierra, entonces en caso de un apagón repentino este valor escrito no desaparecerá, y cuando se cargue el programa, será posible leerlo después?

1. Depende del formato en el que se guarde el archivo. Puede guardar la fecha como un número, un texto o un tipo especializado de fecha.

La segunda pregunta sería esta: ¿Por qué escribimos en el archivo, quién lo verá y cómo?

Escribir en TXT sería la opción más fácil y fiable (se puede leer desde cualquier programa, o casi), CSV es una forma más avanzada de escribir en un archivo. Hay ventajas, pero también hay desventajas definitivas.

2. Yo prefiero abrir una vez en OnInit o en el constructor de la clase principal (depende de la implementación) y cerrar en OnDeinit o en el destructor.

Pero si hay necesidad de reabrir/reabrir el archivo (hay una serie de razones para tales acciones), puede hacerlo periódicamente (una vez cada hora/día/semana).

Si el archivo es grande o la información que contiene será difícil de restaurar, es mejor sobrescribirlo periódicamente o crear uno nuevo.

3. si el valor se ha escrito pero el archivo no se ha cerrado correctamente (por un corte de luz repentino o un fallo del software), lo más probable es que se pierdan los datos (parcial o totalmente, es una cuestión aparte).

Recuerdo haber experimentado con la escritura en txt plano en un programa escrito en Delphi. En el caso de los problemas, el último registro a menudo se ha batido o ha desaparecido.

 

Una función mql que devuelva la hora de la última modificación del archivo sería muy bienvenida.

datetime FileLastModificationTime(string FName);
 
MetaDriver:

Una función mql que devuelva la hora de la última modificación del archivo sería muy bienvenida.

datetime FileLastModificationTime(string FName); 
En general, el sueño de un poeta.
 
Interesting:

1. la fecha se puede guardar como: número, texto o tipo de fecha especial.

No he podido encontrar ninguna función que guarde la fecha como tipo datetime. Aunque sea a través de matrices.

Por alguna razón, parece que sería mejor almacenar los valores de tipo datetime en un archivo binario (el archivo en sí está diseñado para ser leído sólo por el mismo Asesor Experto durante la recarga). Intentaré experimentar.

Interesante:

Si se ha escrito un valor, pero el archivo no se ha cerrado correctamente (por un corte de luz repentino o un fallo del software), lo más probable es que se pierdan los datos (parcial o totalmente, es una cuestión aparte).

Recuerdo haber experimentado con la escritura en txt plano en un programa escrito en Delphi. Allí, en caso de problemas, a menudo se superaba o faltaba el último registro.

Es una pena. Resulta que si quieres garantizar que se guarde el último valor debes usar la función FileClose() todo el tiempo :(

Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
Документация по MQL5: Основы языка / Типы данных / Целые типы / Тип datetime
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Тип datetime - Документация по MQL5
 
Yedelkin:

Es una pena. Resulta que si quieres asegurarte de que se guarda el último valor escrito, tienes que usar FileClose() todo el tiempo :(

FileFlush() se inventó para este propósito.
 

sergeev:

Yedelkin:

Es una pena. Resulta que si quieres estar seguro de guardar el último valor que escribiste, tienes que usar FileClose() todo el tiempo :(

FileFlush() se inventó para este propósito.

Puede ser. Pero no dice nada de cómo usarlo (cuándo usarlo). Puede ser una pregunta fácil para un profesional, pero personalmente no le vi ningún sentido especial a FileFlush() después de leer la documentación...

Y la diferencia entre FileClose() y FileFlush() sigue sin estar clara :/

FileFlush

Restablece en el disco todos los datos que quedan en el buffer de E/S del archivo.

...FileFlush() debe ser llamada entre las operaciones de lectura y escritura de archivos.

Entonces, ¿no hay escritura en el archivo y los datos ya están "volcados en el disco" en alguna parte?

 
Yedelkin:

Posiblemente. Pero no dice cómo usarlo (cuándo usarlo). Puede ser una pregunta fácil para un profesional, pero personalmente, después de leer la documentación no le veo ningún sentido especial a FileFlush()...

Y la diferencia entre FileClose() y FileFlush() sigue sin estar clara :/

Entonces, ¿no se escribe en el archivo, sino que los datos ya se "descargan" en alguna parte?

Aquí hay una descripción más detallada y un ejemplo de MQL4 Reference

void FileFlush( int mango)


Restablece en el disco todos los datos que quedan en el buffer de E/S del archivo.

Nota: FileFlush() debe ser llamada entre las operaciones de lectura y escritura de archivos.
Cuando se cierra un archivo, los datos se restablecen automáticamente en el disco, por lo que no es necesario llamar a FileFlush() antes de llamar a FileClose().
Parámetros:
asa - Descriptor de archivo devuelto por FileOpen().

Ejemplo:

int bars_count=Bars;
int handle=FileOpen("mydat.csv",FILE_CSV|FILE_WRITE);
  
  if(handle>0)
    {
     FileWrite(handle, "#","OPEN","CLOSE","HIGH","LOW");
     for(int i=0;i<bars_count;i++)
       FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
     FileFlush(handle);
     ...
     for(int i=0;i<bars_count;i++)
       FileWrite(handle, i+1,Open[i],Close[i],High[i], Low[i]);
     FileClose(handle);
    }

Si he entendido bien, la llamada FileFlush, a diferencia de FileClose, no cierra el archivo, lo que permite seguir trabajando con él. Y en comparación con la reapertura, debería obtener un aumento significativo de la velocidad.

Aunque se necesita un ejemplo más específico de la tarea en cuestión.

FileFlush - Документация на MQL4
  • docs.mql4.com
FileFlush - Документация на MQL4
 
Interesting:

Aquí hay una descripción más detallada con un ejemplo, de la ayuda de MQL4

"Al cerrar el archivo, los datos se restablecen automáticamente en el disco, por lo que no es necesario llamar a FileFlush() antes de llamar a FileClose()" - Sí, sí, empiezo a ver a qué se referíaSergeev. Entonces, ¿resulta que en lugar de FileClose() se puede llamar a FileFlush() para garantizar que se guarda el último registro en el archivo? ¿Y esto sería una solución competente?