//+------------------------------------------------------------------+
//| Demo_FileTell.mq5 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#propertycopyright"Copyright 2013, MetaQuotes Software Corp."
#propertylink"https://www.mql5.com"
#propertyversion"1.00"
//--- 启动脚本时显示输入参数的窗口
#propertyscript_show_inputs
//--- 输入参数
inputstringInpFileName="file.txt";// 文件名称
inputstringInpDirectoryName="Data";// 目录名称
inputintInpEncodingType=FILE_ANSI;// ANSI=32 或 UNICODE=64
//+------------------------------------------------------------------+
//| 脚本程序启动函数 |
//+------------------------------------------------------------------+
voidOnStart()
{
//--- 指定生成随机数字的变量值
_RandomSeed=GetTickCount();
//--- 字符串起始点位置的变量
ulongpos[];
intsize;
//--- 重置错误值
ResetLastError();
//--- 打开文件
intfile_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_TXT|InpEncodingType);
if(file_handle!=INVALID_HANDLE)
{
PrintFormat("%s file is available for reading",InpFileName);
//--- 接收文件中每个字符串的起始位置
GetStringPositions(file_handle,pos);
//--- 定义文件中的字符串数量
size=ArraySize(pos);
if(!size)
{
//--- 如果文件没有字符串,则停止
PrintFormat("%s file is empty!",InpFileName);
FileClose(file_handle);
return;
}
//--- 随机选择一个字符串数
intind=MathRand()%size;
//--- 字符串起始点的转换位置
FileSeek(file_handle,pos[ind],SEEK_SET);
//--- 阅读和打印ind数字的字符串
PrintFormat("String text with %d number: \"%s\"",ind,FileReadString(file_handle));
//--- 关闭文件
FileClose(file_handle);
PrintFormat("%s file is closed",InpFileName);
}
else
PrintFormat("Failed to open %s file, Error code = %d",InpFileName,GetLastError());
}
//+-------------------------------------------------------------------------------+
//| 函数定义了文件中每个字符串的起始点并在arr数组放置它 |
//| |
//+-------------------------------------------------------------------------------+
voidGetStringPositions(constinthandle,ulong&arr[])
{
//--- 默认数组大小
intdef_size=127;
//--- 为数组分配内存
ArrayResize(arr,def_size);
//--- 字符串计数器
inti=0;
//--- 如果这不是文件结尾,那么至少有一个字符串
if(!FileIsEnding(handle))
{
arr[i]=FileTell(handle);
i++;
}
else
return;// 文件为空,退出
//--- 根据编码定义字节转换
intshift;
if(FileGetInteger(handle,FILE_IS_ANSI))
shift=1;
else
shift=2;
//--- 通过循环中的字符串
while(1)
{
//--- 阅读字符串
FileReadString(handle);
//--- 检查文件结尾
if(!FileIsEnding(handle))
{
//--- 存储下一个字符串的位置
arr[i]=FileTell(handle)+shift;
i++;
//--- 如果超过增加数组大小
if(i==def_size)
{
def_size+=def_size+1;
ArrayResize(arr,def_size);
}
}
else
break;// 文件结尾,退出
}
//--- 定义数组的实际大小
ArrayResize(arr,i);
}