与文件一起工作。 - 页 3

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

不是代替,而是必然的。

冲洗 - 重置剩余数据,但 关闭文件。这就是你想要的,对吗?

关闭--将其余的数据重置到磁盘并关闭。

 
sergeev:

不是代替,而是必然的。

冲洗 - 重置剩余数据,但 关闭文件。这就是你想要的,对吗?

关闭 - 将剩余的数据冲到磁盘上并关闭。

是的,这正是我们正在谈论的问题。谢谢你的提示,这是一个聪明的解决方案。
 
Yedelkin:

关于使用FileFlush()的时间最小化的东西,效果不是很好。

2011.05.29 21:58:20 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 133766
2011.05.29 22:00:33 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 133734
事实上,这两个功能需要相同的时间来工作。

根据我的理解,这一行将位置移动到文件的开头,没有偏移。这允许覆盖现有的信息(即日期被更新,但它不会在文件中累积)。

FileSeek(handle_file,0,SEEK_SET);

使用move to end of file而不是SEEK_SET,数据会在文件中堆积。

 
Yedelkin:

每次刷新时,你都会打开一个新的文件句柄。为了什么?而且你也没有顺便关闭它。

FileFlush函数的 好处是,你不需要重新打开句柄。

Документация по MQL5: Файловые операции / FileFlush
Документация по MQL5: Файловые операции / FileFlush
  • www.mql5.com
Файловые операции / FileFlush - Документация по MQL5
 
Interesting:

1.按照我的理解,这一行是在文件中移动位置,没有偏移。这允许现有的信息被覆盖(即日期被更新,但不在文件中累积)。

因此,如果用它代替SEEK_SET 跳到文件的末尾,数据将在文件中累积。
已经有时间删除我的信息了。在这个例子中,在向文件写完后插入了FileFlush()。
 
TheXpert:

每次刷新时,你都会打开一个新的文件句柄。为了什么?而且你也没有顺便关闭它。

FileFlush函数的 好处是,你不需要重新打开句柄。

我是这样做的。

int handle_file;
datetime t;
uint u;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---пример с функцией FileFlush()
   u=GetTickCount();
   handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);
//for(int i=0;i<100000;i++)
   for(int i=0;i<1000;i++)
     {
      if(handle_file!=INVALID_HANDLE)
        {
         t=TimeLocal();
         FileSeek(handle_file,0,SEEK_SET);
         FileFlush(handle_file);
         FileWrite(handle_file,t);
        }
     }
   FileClose(handle_file);
   Print("FileFlush. GetTickCount() = ",GetTickCount()-u);

//---пример без функции FileFlush()
   u=GetTickCount();
   for(int i=0;i<1000;i++)
     {
      handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);
      if(handle_file!=INVALID_HANDLE)
        {
         t=TimeLocal();
         FileSeek(handle_file,0,SEEK_SET);
         FileWrite(handle_file,t);
         FileClose(handle_file);
        }
     }
   Print("FileClose. GetTickCount() = ",GetTickCount()-u);
  }

结果。

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 531

根据文件规定,交换了线路。

         FileFlush(handle_file);
         FileWrite(handle_file,t);
我不明白FileWrite() 之前调用FileFlush() 有什么意义。
 
Yedelkin:

我是这样做的。

结果。

2011.05.29 23:14:31 FlushSave (EURGBP,M1) FileFlush.GetTickCount() = 13563
2011.05.29 23:14:32 FlushSave (EURGBP,M1) FileClose.GetTickCount() = 531

我根据文件规定,调换了线路。

FileWrite() 之前调用FileFlush() 的意义还未 被理解

这里有一个变体。

int handle_file;
datetime t;
uint u;

void OnStart()
{
//---пример с функцией FileFlush()
u=GetTickCount();

handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);

  for(int i=0;i<1000;i++)
  {
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileFlush(handle_file);
    FileWrite(handle_file,t);
    }
  }

FileClose(handle_file);

Print("FileFlush. GetTickCount() = ",GetTickCount()-u);

}

其结果是FileFlush。GetTickCount() = 26125

这里有一个变体。

int handle_file;
datetime t;
uint u;

void OnStart()
{
//---пример без функции FileFlush()
u=GetTickCount();

  for(int i=0;i<1000;i++)
  {
  handle_file=FileOpen("Ye_file2.txt",FILE_READ|FILE_WRITE|FILE_TXT);
      
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileWrite(handle_file,t);
    FileClose(handle_file);
    }

  }

Print("FileClose. GetTickCount() = ",GetTickCount()-u);

}
其结果是FileClose。GetTickCount() = 3969
 

这个选项给出的结果在47和110之间

int handle_file;
datetime t;
uint u;

void OnStart()
{

u=GetTickCount();

handle_file=FileOpen("Ye_file.txt",FILE_READ|FILE_WRITE|FILE_TXT);

  for(int i=0;i<1000;i++)
  {
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileWrite(handle_file,t);
    }
  }

FileClose(handle_file);

Print("FileFlush. GetTickCount() = ",GetTickCount()-u);

}

1.结论 - 在一个循环中使用FileFlush 会使执行速度减慢260倍左右。

2.在这个变体中,对50,000条记录进行循环,结果如下 - FileFlush。GetTickCount() = 1891.

3.我在执行50000次写入循环而不退出文件时,未能杀死终端(我关闭了终端并 "杀死 "了进程)。

4.我能够用100000个循环杀死终端,而文件中包含了超过65536条记录(Excel 2003中的空间这么大)。

 
Yedelkin:

我按照文件规定调换了线路。

文件中哪里有这样的规定?

我还是不明白FileWrite() 之前调用FileFlush() 的意义

你怎么能让没有的东西有意义呢?返回字符串的顺序并仔细检查。显然,文件没有正确表达。

但是...感谢你的测试,这个错误似乎已经被发现了--当不做任何改变时,FileFlush 似乎占用了过多的时间。

有趣的 是。

OMG!这是推论的地方,它是一个泥潭。这就是 "OOP更快 "或 "指标很慢,我们应该把整个代码移到专家顾问上 "等说法出现的原因。

 
papaklass:

专家,写下如何正确使用这个功能。

假设如此。

// open handle
for(int i=0;i<1000;i++)
  {
    if(handle_file!=INVALID_HANDLE)
    {
    t=TimeLocal();
    FileSeek(handle_file,0,SEEK_END);
    FileWrite(handle_file,t);
    FileFlush(handle_file);
    }
  }
// close handle

也就是说,将FileClose -- FileOpen捆绑与FileFlush 进行比较是正确的。

理论上,FileFlush应该是FileClose的一部分,不可能比捆绑的速度慢。

在变化出现之前,冲洗变化是没有意义的,因为它们还没有出现 :)

但是,尽管结论很疯狂,但测试是有参考价值的,所以我们等待开发者对没有变化时功能如何工作的评论。