2017-01-03 54 views
0

我一直在尋找通過我朋友的OBJ加載代碼。他用C++完成了它;代碼是:關於scanf的這段代碼是什麼?

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]。請解釋它是如何工作的?

+3

你能不能問你的朋友?這是他們的代碼,他們應該擁有它。 – StoryTeller

+0

我可以問他,但他到星期五都很忙。 – Fennekin

+0

這是obj文件http://pastebin.com/pvi7bU6y – Fennekin

回答

5
t = strstr(STREAM,"vertices"); 

t將指向子"vertices"的位置,裏面STREAM

&t[0]"vertices"中第一個字符的地址。相當於t本身。 這同樣適用於&STREAM[0],它是STREAM第一個字符的地址。減去它們會給你起始索引t

所以你的朋友想要從STREAM中讀取,開始十個字符之前t

所有這些都通過簡單的t - 10表達得更加清晰。

+1

不,他希望從'STREAM'讀*,在't'前面開始十個字符。更具體地說,使用格式字符串'%s#%i vertices'讀取。另外:由於它只讀取了't'前面的十個字符,字符串和整數不能太大。 – gurka

+0

@gurka - 你確實是對的。我曾經錯誤地將OP標記爲'sprintf',而不是'sscnaf'。 – StoryTeller

4

我不知道爲什麼它這樣做的方式,但

&STREAM[&t[0]-&STREAM[0]-10]

相同

t-10

這是10個字符的「頂點」開始前(和「面部「)

1

& STREAM [& T [0] - & STREAM [0] -10] = & STREAM [addressof(T [0]) - addressof(STREAM [0]) - 10]。它給出了tSTREAM減去10的偏移量。如果知道tSTREAM是同一緩衝區上的指針,則寫入t - 10應該是相同的。

3

你的朋友是否經常出現一些混淆的C比賽?

&t[0]*t中第一個字節的地址。該地址當然是t已經包含的內容。

&STREAM[0]類似,與STREAM的地址相同。

因此,&t[0]-&STREAM[0]計算tSTREAM開始之間的字節數(字符)。如果您使用它作爲STREAM的索引並取字節&STREAM[&t[0]-&STREAM[0]]的地址 - 同樣,您將獲得已在t中的地址。

而且如果從減去10個字節,&STREAM[&t[0]-&STREAM[0]-10],你最終t - 10 ...