void CRandomArrayFromTxt::GetRandomArrayFromTxt(int m_Collect_Times, double *a_Random, int m_Txt_Line, int m_Txt_Row, int m_Txt_Spacing) {
int m,mx,my,cl; srand((unsigned)time(NULL)); // 生成时间种子
m=rand()%m_Txt_Line; // 返回一个0-m_Txt_Line-1的随机数,即查表的起始位置
mx=m%m_Txt_Row; // 查表起始位置的列号,文件头为0行0列
my=m/m_Txt_Row; // 查表起始位置的行号
cl=(m_Collect_Times+mx-1)/m_Txt_Row+1; // 需要从数表中读取的行数
// 打开txt文本的数表。
CStdioFile file1( "C:\\Yg\\Debug\\ramdom1000.txt", Cfile::modeNoTruncate | Cfile::modeRead | Cfile::typeText);
CString strc; int ct=0; // 用于记录当前已经取得的随机数个数
for(m=0;m<my;m++) { file1.ReadString(strc); }
// 取出有用的行,直到取够为之
for(int n=0;n<cl;n++) { if(n+my==m_Txt_Line) file1.SeekToBegin();
// 数表不够长,重新定位到文件头
file1.ReadString(strc);
if(n==0) // 如果是取得的第一行
{ int aw1,aw2; aw1=strc.GetLength(); for(m=0;m<mx+1;m++) // 过掉前面无用的空格
{ aw1=strc.GetLength(); aw2=strc.Find(" "); // 找到作为间隔的前三个空格所在位置
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串
}
// 下面取出剩下的字符串中每三个空格前面的字符串,就是所要查一个数据
for(m=0;m<m_Txt_Row-mx&&ct<m_Collect_Times;m++) { aw2=strc.Find(" ");// 找到作为间隔的后三个空格所在位置
if(mx==m_Txt_Row-1||m==m_Txt_Row-mx-1) a_Random[ct]=atof(strc); else a_Random[ct]=atof(strc.Left(aw2)); // 保存数据到数组
aw1=strc.GetLength(); aw2=strc.Find(" "); // 找到作为间隔的前三个空格所在位置
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串
ct++; } } else { GetRandomArrayFromALine(strc,a_Random, m_Collect_Times, m_Txt_Row, m_Txt_Spacing, ct); ct+=m_Txt_Row; } } file1.Close(); }
///////////////////////
// 从一行中取出数字
///////////////////////
void CRandomArrayFromTxt::GetRandomArrayFromALine(CString strc, double *a_Random, int m_Collect_Times, int m_Txt_Row, int m_Txt_Spacing, int ct) { int aw1,aw2; aw1=strc.GetLength(); aw2=strc.Find(" "); strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串
for(int m=0;m<m_Txt_Row&&ct<m_Collect_Times;m++) { aw2=strc.Find(" "); if(m==m_Txt_Row-1) a_Random[ct]=atof(strc); else a_Random[ct]=atof(strc.Left(aw2));// 保存数据到数组
aw1=strc.GetLength(); aw2=strc.Find(" ");// 找到作为间隔的前三个空格所在位置
strc=strc.Right(aw1-aw2-m_Txt_Spacing); // 取这三个空格右边的所有字符串
ct++; } }
|