与文件一起工作。 - 页 2

 
mql5:
MQL中的字符串是unicode(每个字符2个字节),kernel32.dll函数是ansi(每个字符1个字节)。使用一个字节数组和 函数StringToCharArray来调用ansish函数
怎么说呢?
我记得,Windows几乎完全是Unicode,而且已经有很长一段时间了......。

还是kernel32.dll是个例外?

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

看了一下,真的是安西,很奇怪......。

 

给外行的建议。我在处理文件方面的知识处于Word用户的水平。

专家顾问需要在文件中覆盖一个日期时间类型的值,每次都是在文件的开头,在整个工作时间内。读取最后写入的数值--只有在重新启动专家顾问的时候。我做了一个简单的结构,使用.csv文件--一切似乎都在工作。出现了以下问题。

1)为了尽量减少编写程序的时间,使用哪种文件类型来保存日期时间值比较好?根据我的理解,.csv文件是用字符串工作的,在有字符串的地方,处理这些字符串会有额外的时间消耗。

2) 如何正确使用FileClose(): 我应该在每次写完一个新值后关闭文件,还是在OnDeinit()函数中一次性关闭它?我想打开一次文件,然后只需向其中写入新的数值,而不必在多次打开和关闭文件上浪费时间。但这样做是否安全?

3) 我是否正确理解,如果某些值被写入文件,但文件没有关闭,那么在突然断电的情况下,这个写入的值不会消失,当程序被加载时,以后就可以读取它?

 

Yedelkin:

出现了以下问题。

1)为了尽量减少写程序的时间,用什么文件类型来保存日期时间值比较好?根据我的理解,.csv文件是用字符串工作的,在有字符串的地方,处理这些字符串会有额外的时间消耗。

2) 如何正确使用FileClose():我应该在每次写完一个新值后关闭文件,还是在OnDeinit()函数中一次性关闭它? 我想打开一次文件,然后只需向其中写入新的数值,而不必在多次打开和关闭文件上浪费时间。但这样做是否安全?

3) 我是否正确理解,如果某些值被写入文件,但文件没有关闭,那么在突然断电的情况下,这个写入的值不会消失,当程序被加载时,以后就可以读取它?

1.这取决于文件的保存格式。你可以把日期保存为数字、文本或日期时间 的专门类型。

第二个问题是这样的:我们为什么要写到文件中,谁会查看它,如何查看?

写入TXT将是最简单和最可靠的选择(你可以从任何程序,或几乎任何程序中读取它),CSV是一种更高级的写入文件 的方式。有优势,但也有明确的劣势。

2.我更喜欢在OnInit或主类的构造函数中打开一次(取决于实现),在OnDeinit或析构函数中 关闭。

但如果有必要重新打开/再打开文件(有很多原因导致这种行为),你可以定期进行(每小时/天/周一次)。

如果文件很大或其中的信息难以恢复,最好是定期覆盖它或创建一个新的文件。

3.如果数值被写入,但文件没有正确关闭(突然断电或软件挂起),很可能数据会丢失(部分或全部是一个单独的问题)。

我记得我曾在一个用Delphi编写的程序中试验过向纯txt写东西。在出现问题的情况下,最后的记录往往被打乱或丢失。

 

如果有一个mql函数返回文件最后一次修改的时间,将是非常受欢迎的。

datetime FileLastModificationTime(string FName);
 
MetaDriver:

如果有一个mql函数返回文件最后一次修改的时间,将是非常受欢迎的。

datetime FileLastModificationTime(string FName); 
总的来说--一个诗人的梦想!
 
Interesting:

1.日期可以保存为:数字、文本或特殊的日期时间 类型。

我找不到任何可以将日期保存为数据时间类型的 函数。如果只是通过数组。

出于某种原因,似乎在二进制文件中存储日期时间类型的值会更好(文件本身被设计成只能在重新加载时被同一个智能顾问读取)。我将尝试进行实验。

有趣的 是。

如果数值被写入,但文件没有正确关闭(突然断电或软件挂起),很可能数据会丢失(部分或完全是一个单独的问题)。

我记得我曾在一个用Delphi编写的程序中试验过写成纯txt。在出现问题的情况下,最后的记录往往被打乱或丢失。

这真是太糟糕了。事实证明,如果你想保证保存最后一个值,你必须一直使用FileClose() 函数:(

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

这是个遗憾。事实证明,如果你想确保最后写入的值被保存,你必须一直使用FileClose():(

FileFlush() 就是为此目的而发明的。
 

sergeev:

耶德尔金

这是个遗憾。事实证明,如果你想保证保存你写的最后一个值,你必须一直使用FileClose():(

FileFlush()就是为此目的而发明的。

这可能是。但它并没有说如何使用它(何时使用它)。对于专业人员来说,这可能是一个简单的问题,但就我个人而言,在阅读了文档之后,我没有发现FileFlush()有任何特殊意义...

FileClose()和FileFlush()之间 的区别仍然不清楚:/

文件刷新

将文件I/O缓冲区中的所有剩余数据重置到磁盘。

...在文件读取和文件写入操作之间必须调用FileFlush()

那么,没有向文件写入,数据已经在某处 "刷入磁盘 "了?

 
Yedelkin:

有可能。但它没有说如何使用它(何时使用)。对于专业人员来说,这可能是一个简单的问题,但就我个人而言,在阅读了文档之后,我没有看到FileFlush()有任何特殊意义......

FileClose()和FileFlush()之间 的区别仍然不清楚:/

那么,没有向文件写入数据,但数据已经被 "冲 "到某个地方了?

下面是MQL4 参考资料中更详细的描述和例子

空白文件冲 刷( int handle)


将文件I/O缓冲区中剩余的所有数据重置到磁盘。

注意:FileFlush()必须在文件读取和文件写入操作之间调用。
当一个文件被关闭时,数据会自动重置到磁盘上,所以在调用FileClose()之前不需要调用FileFlush()。
参数。
处理 - 由FileOpen()返回的文件描述符。

例子。

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);
    }

如果我理解正确的话,FileFlush调用,与FileClose不同,并不关闭文件,这允许继续使用它。而与重开相比,你应该得到一个明显的速度提升。

虽然你需要一个更具体的例子来说明手头的任务。

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

下面是MQL4 帮助中的一个更详细的描述和一个例子

"关闭文件时,数据会自动重置到磁盘上,所以在调用FileClose()之前不需要调用FileFlush()" - 是的,是的,我开始明白sergeev 在说什么了。所以,事实证明,你可以调用FileFlush()来代替FileClose(),以保证将最后一条记录保存到文件中?而这将是一个合格的解决方案?