data.txt中数据格式为:
-3.00000000000000E+0001   3.00000000000000E+0001   1.41790802462861E+0001
-2.90000000000000E+0001   3.00000000000000E+0001   1.36591880340699E+0001
-2.80000000000000E+0001   3.00000000000000E+0001   1.31611965915303E+0001
-2.70000000000000E+0001   3.00000000000000E+0001   1.26845463044215E+0001
-2.60000000000000E+0001   3.00000000000000E+0001   1.22287192650106E+0001
-2.50000000000000E+0001   3.00000000000000E+0001   1.17932357563260E+0001
-2.40000000000000E+0001   3.00000000000000E+0001   1.13776511425486E+0001
-2.30000000000000E+0001   3.00000000000000E+0001   1.09815531113487E+0001
... ...程序如下:
...
int LineNum;       ///数据的行数
double *pOriginX,*pOriginY,*pOriginZ; ///数据存储的地址
CString m_OriginData;                 ///存储文件内容
...void CInput::OnOpenfile()
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle="导入坐标数据文件";
fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
fileDlg.m_ofn.lpstrDefExt="txt";
if(IDOK==fileDlg.DoModal())
{
CFile file;
file.Open(fileDlg.GetPathName(),CFile::modeRead);
int nlen =file.GetLength();//The length of the file.
char   *pBuffer=new   char[nlen+1];//建立一个存储数据的缓冲区
file.Read(pBuffer,nlen);  //Reads data into a buffer 
pBuffer[nlen+1]='\0'; 
file.Close();
GetDlgItem(IDC_DISPLAY)->SetWindowText(pBuffer);///////////////////////////////////////////////////////////////////
CStdioFile file1;  
CString str;
file1.Open(fileDlg.GetPathName(),CFile::modeRead);//The full path of the file.
while(file1.ReadString(str))  //读取文件一行的内容
{
LineNum++;
}
    file1.SeekToBegin();   //Sets the value of the file pointer to the beginning of the file. 
///////////////////////////////////以上程序段获得数据文件的行数,以确定动态数组的大小。
double *chX= new double[LineNum];
double *chY= new double[LineNum];
double *chZ= new double[LineNum];//////定义存放XYZ坐标的变长数组;

pOriginX=chX;
pOriginY=chY;
pOriginZ=chZ;     //指向变长数组; for(int k=0;k<LineNum;k++)
{
*(pOriginX+k)=0;
*(pOriginY+k)=0;
*(pOriginZ+k)=0;
}                      ///先将变长数组清0

for(int i=0;i<LineNum;i++)
{
file1.ReadString(str);   //modeRead
char ch[100];
sprintf(ch,"%s",str);    //Write formatted data to a string.
int strlength=str.GetLength();  //A count of the bytes in the string.
for(int j=0;j<strlength;j++)
{
//怎样才能把坐标区分开来分别存入数组中呢????这个部分我不会写~~~
                        }
}
}
}

解决方案 »

  1.   

    也就是说
    将3.00000000000000E+0001  3.00000000000000E+0001  1.41790802462861E+0001 
    按照空格分隔,第一个数字存入pOriginX,第二个数字存入pOriginY,第三个数字存入pOriginZ很简单的问题,可是就是不会- -||
      

  2.   

    strtok分割字符串,然后赋值给对应的参数
    或者用
    sscanf()
      

  3.   

    谢谢楼上,查了一下strtok的功能
    有个问题,
     2.50000000000000E+0001   1.00000000000000E+0000   4.55668524839770E+0000
     2.60000000000000E+0001   1.00000000000000E+0000   4.95604587462237E+0000
     2.70000000000000E+0001   1.00000000000000E+0000   5.37549993886696E+0000
     2.80000000000000E+0001   1.00000000000000E+0000   5.81539613479712E+0000
     2.90000000000000E+0001   1.00000000000000E+0000   6.27570840318381E+0000
     3.00000000000000E+0001   1.00000000000000E+0000   6.75636218394042E+0000
    -3.00000000000000E+0001  -0.00000000000000E+0000   6.76325647404073E+0000
    -2.90000000000000E+0001  -0.00000000000000E+0000   6.30278904318635E+0000
    -2.80000000000000E+0001  -0.00000000000000E+0000   5.86088238947563E+0000
    -2.70000000000000E+0001  -0.00000000000000E+0000   5.43716207114607E+0000象这样由于正负号导致空格数变化的数据怎么分解呢
      

  4.   

    strtok只是根据分割符进行分割,你分隔符设为空格就可以了。空格数的多少并不会影响分割的结果。
    Just Try It
      

  5.   

    CString 读好了之后判断下就好了,这个是很简单的
      

  6.   

    如果是按行读取的可以用sscanf嘛 用过你就知道这个函数有多好用了sscanf(str,"%e %e %e",&pOriginX,&pOriginY,&pOriginZ)
      

  7.   

    最简单的方法:
    const int num = 10;
    double x[num], y[num], z[num];
    FILE* pf = fopen("data.txt", "r");
    for(int i=0; i<num; i++)
       fscanf(pf, "%lf %lf %lf", &x, &y, &z);
    fclose(pf);
      

  8.   

    double *pOriginX,*pOriginY,*pOriginZ; ///数据存储的地址 
    for(int i=0;i<LineNum;i++)
    {
    file1.ReadString(str);  
    sscanf(str,"%lf %lf %lf",&pOriginX,&pOriginY,&pOriginZ);
    }问个问题:随着for循环的不断进行&pOriginX的地址会自动加1么?还是要写成这样的格式:sscanf(str,"%lf %lf %lf",&pOriginX+i,&pOriginY+i,&pOriginZ+i);请高手指教!
      

  9.   

    for(int i=0;i<LineNum;i++)
    {
    file1.ReadString(str);
    sscanf(str,"%lf %lf %lf",&pOriginX[i],&pOriginY[i],&pOriginZ[i]);
    }正确的做法 谢谢楼上朋友