117.4,187.8,0; 101.1,187.8,43.01; 99.67,193.6,42.41;
101.3,195.5,43.1; 104.6,193.6,44.52; 108.3,187.8,46.08;
上面是一个模型文件(只是一部分,三行),每行有3-4个点,每个点之间用分号格开,点的x,y,z坐标使用都好格开,现在想提取每个点的相应坐标并生成一个点的数组。问题是使用CString里面的什么函数能实现上面的功能,我看了MSDN,里面提到一个Tokenize函数,但是好像不是CString累的函数,步知道如何使用。
希望大侠们能指教一下,最好有代码,谢谢!
13 个解决方案
#1
调用序列:
Find
Left
atoi
用Find来寻找并定位各个“,”和“;”关键字,用Left来截取数据,用atoi来把字符串转换为数字。
Find
Left
atoi
用Find来寻找并定位各个“,”和“;”关键字,用Left来截取数据,用atoi来把字符串转换为数字。
#2
补充:Find和Left是CString的成员函数,atoi是C++标准库函数。
#3
楼上:
是atof9()
是atof9()
#4
谁知道Tokenize()怎么用啊?
#5
好像VC2002以上可以使用Tokenize。
#6
我是说CString。
#7
fgets()
strtok()
while()
{
atof()
strtok()
}
strtok()
while()
{
atof()
strtok()
}
#8
CString 里没有转换函数
对于ANSI版本可以使用:
sscanf((LPCSTR)(LPCTSTR)szCString, "%f", &f);
对于ANSI版本可以使用:
sscanf((LPCSTR)(LPCTSTR)szCString, "%f", &f);
#9
用CString的Find查找到;
然后用Right,Mid,Left来截取
然后用Right,Mid,Left来截取
#10
何必一定用CString呢?
直接使用标准库里的strchr函数搜索指定的字符的位置,岂不是很简单
直接使用标准库里的strchr函数搜索指定的字符的位置,岂不是很简单
#11
搞定!
while(file.ReadString(str)!=NULL)
{
//AfxMessageBox(str);
int pos1=0,pos2=0;
//pos2 = str.Find(';',pos1);
while((pos2 = str.Find(';',pos1))>0){
str1 = str.Mid(pos1,pos2-pos1)+",";
int pos3=0,pos4=0;
int index=0;
while((pos4 = str1.Find(',',pos3))>0){
str2[index++] = str1.Mid(pos3,pos4-pos3);
if(index==3)
{
Point3D p(atof(str2[0])/1000,atof(str2[1])/1000,atof(str2[2])/1000);
ptArray.push_back(p);
break;
}
pos3=pos4+1;
}
pos1 = pos2+1 ;
}
}
while(file.ReadString(str)!=NULL)
{
//AfxMessageBox(str);
int pos1=0,pos2=0;
//pos2 = str.Find(';',pos1);
while((pos2 = str.Find(';',pos1))>0){
str1 = str.Mid(pos1,pos2-pos1)+",";
int pos3=0,pos4=0;
int index=0;
while((pos4 = str1.Find(',',pos3))>0){
str2[index++] = str1.Mid(pos3,pos4-pos3);
if(index==3)
{
Point3D p(atof(str2[0])/1000,atof(str2[1])/1000,atof(str2[2])/1000);
ptArray.push_back(p);
break;
}
pos3=pos4+1;
}
pos1 = pos2+1 ;
}
}
#12
字符串操作本来就很复杂的 呵呵
#13
实现才最重要吧。不一定非要用Cstring吧?
#1
调用序列:
Find
Left
atoi
用Find来寻找并定位各个“,”和“;”关键字,用Left来截取数据,用atoi来把字符串转换为数字。
Find
Left
atoi
用Find来寻找并定位各个“,”和“;”关键字,用Left来截取数据,用atoi来把字符串转换为数字。
#2
补充:Find和Left是CString的成员函数,atoi是C++标准库函数。
#3
楼上:
是atof9()
是atof9()
#4
谁知道Tokenize()怎么用啊?
#5
好像VC2002以上可以使用Tokenize。
#6
我是说CString。
#7
fgets()
strtok()
while()
{
atof()
strtok()
}
strtok()
while()
{
atof()
strtok()
}
#8
CString 里没有转换函数
对于ANSI版本可以使用:
sscanf((LPCSTR)(LPCTSTR)szCString, "%f", &f);
对于ANSI版本可以使用:
sscanf((LPCSTR)(LPCTSTR)szCString, "%f", &f);
#9
用CString的Find查找到;
然后用Right,Mid,Left来截取
然后用Right,Mid,Left来截取
#10
何必一定用CString呢?
直接使用标准库里的strchr函数搜索指定的字符的位置,岂不是很简单
直接使用标准库里的strchr函数搜索指定的字符的位置,岂不是很简单
#11
搞定!
while(file.ReadString(str)!=NULL)
{
//AfxMessageBox(str);
int pos1=0,pos2=0;
//pos2 = str.Find(';',pos1);
while((pos2 = str.Find(';',pos1))>0){
str1 = str.Mid(pos1,pos2-pos1)+",";
int pos3=0,pos4=0;
int index=0;
while((pos4 = str1.Find(',',pos3))>0){
str2[index++] = str1.Mid(pos3,pos4-pos3);
if(index==3)
{
Point3D p(atof(str2[0])/1000,atof(str2[1])/1000,atof(str2[2])/1000);
ptArray.push_back(p);
break;
}
pos3=pos4+1;
}
pos1 = pos2+1 ;
}
}
while(file.ReadString(str)!=NULL)
{
//AfxMessageBox(str);
int pos1=0,pos2=0;
//pos2 = str.Find(';',pos1);
while((pos2 = str.Find(';',pos1))>0){
str1 = str.Mid(pos1,pos2-pos1)+",";
int pos3=0,pos4=0;
int index=0;
while((pos4 = str1.Find(',',pos3))>0){
str2[index++] = str1.Mid(pos3,pos4-pos3);
if(index==3)
{
Point3D p(atof(str2[0])/1000,atof(str2[1])/1000,atof(str2[2])/1000);
ptArray.push_back(p);
break;
}
pos3=pos4+1;
}
pos1 = pos2+1 ;
}
}
#12
字符串操作本来就很复杂的 呵呵
#13
实现才最重要吧。不一定非要用Cstring吧?