我正在浏览我朋友的obj加载代码。他用C ++完成了它;代码是:
bool LoadObj(char* given){
char tempText[60];
std::ifstream OB(given);
OB.seekg(0,OB.end); int length = OB.tellg() ; OB.seekg(0,OB.beg);
char* STREAM = new char[length];
OB.read(STREAM,length);
OB.close();
char *t,dump[20];
int Number_Of_Vertices,Number_Of_faces;
t = strstr(STREAM,"vertices");
sscanf(&STREAM[&t[0]-&STREAM[0]-10],"%s # %i vertices",&dump,&Number_Of_Vertices);
printf("\nthere are %i vertices",Number_Of_Vertices);
t = strstr(STREAM,"faces");
sscanf(&STREAM[&t[0]-&STREAM[0]-10],"%s # %i faces",&dump,&Number_Of_faces);
printf("\nthere are %i faces",Number_Of_faces);
......
当我通过加载obj文件测试它时,它正确打开。但是我不理解sscanf()
的第一个参数,即:&STREAM[&t[0]-&STREAM[0]-10]
。请解释它是如何工作的?
答案 0 :(得分:5)
t = strstr(STREAM,"vertices");
t
将指向"vertices"
内的子字符串STREAM
的位置。
&t[0]
是"vertices"
中第一个字符的地址。相当于t
本身。
这同样适用于&STREAM[0]
,它是STREAM
的第一个字符的地址。减去它们会为您提供t
的起始索引。
所以你的朋友想要从STREAM
开始阅读,在 t
之前开始十个字符。
所有这些都通过简单的t - 10
更明确地表达出来。
答案 1 :(得分:4)
我不知道为什么会这样做但是
&STREAM[&t[0]-&STREAM[0]-10]
与
相同 t-10
在“顶点”(和“面孔”)开始之前是10个字符
答案 2 :(得分:3)
你的朋友经常参加一些混淆的C竞赛吗?
&t[0]
获取*t
中第一个字节的地址。该地址当然是t
已包含的内容。
类似于&STREAM[0]
,其地址与STREAM
相同。
因此,&t[0]-&STREAM[0]
计算t
与STREAM
开头之间的字节数(字符)。如果您将其用作STREAM
的索引并获取 字节&STREAM[&t[0]-&STREAM[0]]
的地址 - 再次获取t
中已有的地址。
如果你从&STREAM[&t[0]-&STREAM[0]-10]
中减去10个字节,最后会得到t - 10
...
答案 3 :(得分:1)
& STREAM [& t [0] - & STREAM [0] -10] =& STREAM [addressof(t [0]) - addressof(STREAM [0]) - 10]。它给出了t
中STREAM
的偏移量减去10.写t - 10
将是相同的,因为知道t
和STREAM
是同一缓冲区上的指针。