2017-01-03 2 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は、STREAMの部分文字列"vertices"の位置を示します。

&t[0]は、"vertices"の最初の文字のアドレスです。 t自体に相当します。 同じことが&STREAM[0]に適用されます。最初の文字のアドレスはSTREAMです。それらを引くと、開始インデックスはtになります。

あなたの友人はSTREAMから、の前にtの前に読むことを希望しています。

これはすべて、単純にt - 10でより明確に表現されています。

+1

いいえ、彼は 't'の前に10文字を始めて' STREAM'から*を*読みたいと思っています。より具体的には、フォーマット文字列 '%s#%i vertices'を使用して読み込まれます。また、 't 'の前に10文字しか読み込まないので、文字列と整数は大きすぎることはできません。 – gurka

+0

@gurka - あなたは本当に正しいです。私は間違ってOPにsprintfがあり、sscnafではないことを間違いなくブランド化しました。 – StoryTeller

4

それはそのように行われますが

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

t-10

と同じであること」は「頂点」の開始前に10文字だ(とだ、なぜ私にはわかりません顔」)

1

& STREAM [& T [0] - [0] -10 & STREAM] = & STREAM【のAddressOf(T [0]) - のAddressOf(STREAM [0]) - 10]。 tのオフセットはSTREAMから10を引いたものになります。t - 10の書き込みは、同じバッファ上のポインタであるtSTREAMが同じであることを認識していました。

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で終わる...

関連する問題