2013-05-28 124 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