2013-05-28 54 views
0

我正在處理的代碼是打開未初始化的文件並掃描以下變量。我試圖找出它在做什麼,但我不明白FSYM和ISYM格式(?)試圖做什麼,除了可能將它們聲明爲float或int字符串。這個sscanf在做什麼?

sscanf(line, "%"ISYM" %"ISYM" %"ISYM" %"FSYM" %"FSYM" %"FSYM" %"FSYM" %"FSYM, 
    &idummy, // nt - skip 
    &idummy, // l - skip 
    &idummy, // lev - skip 
    rad+nl, // x = radial coordinate 
    vel+nl, // xdot = radial velocity 
    den+nl, // rho = density 
    &dummy, // tev - skip temperature (eV) 
    pre+nl // p = pressure 
    ); 

行是打開的文件的第一行,然後掃描到變量。關於發生了什麼的任何想法?

+1

或許這些都是在編譯期間計算爲字符串定義。 – moooeeeep

+2

嘗試'printf'那些 –

回答

1

這是預處理字符串連接。它們必須在其他地方定義爲字符串;當cpp命中多個相鄰的字符串時,它將它們連接在一起,因此代碼使用預處理器從預定義的部分構建更長的字符串。

+0

這不是預處理器字符串連接。 –

+1

@NikBougalis:是的。或者你是否將「預處理」定義爲除「翻譯階段1至6」之外的其他內容(即編譯之前的所有處理)? –

+0

我將預處理器連接定義爲「A ## B」,但可能過於迂腐。該標準是否指消除閉合雙引號的過程,接着是空格,然後是另一個雙引號作爲「級聯」? –

7

大概,它們是在代碼中的某處定義的宏,它擴展爲包含scanf字符串的必要說明符的字符串文字。他們會像

#define ISYM "d" // integer symbol for scanf 
#define FSYM "f" // floating-point symbol for scanf 

,使膨脹後的參數變得

"%""d"" %""d"" %""d"" %""f"" %""f"" %""f"" %""f"" %""f" 

,而且由於連續的字符串文字一起營造一個字符串,這相當於

"%d %d %d %f %f %f %f %f" 

如果您想要更改類型,這可能會很有用:

#ifdef BIG_TYPES 
    typedef long i_type; 
    typedef double f_type; 
    #define ISYM "ld" 
    #define FSYM "lf" 
#else 
    typedef int i_type; 
    typedef float f_type; 
    #define ISYM "d" 
    #define FSYM "f" 
#endif 

當然,C++有類型安全的I/O,以避免這一切的廢話:

std::istringstream ss(line); 
ss >> idummy; 
// and so on 
+0

或'ISYM'表示「i符號」,'FSYM'表示「f符號」又名'整數符號'和'浮點符號' – 2013-05-28 18:43:04

+0

@ 0A0D:是的,可能它們是「整數符號」和「浮點數符號」。 –

+0

你是正確的,經過一番思考後,我發現他們在另一個文件中定義。原來你對這個問題的定義也是正確的。 – Adrian