这个sscanf在做什么?

时间:2013-05-28 18:36:22

标签: c++

我正在处理的代码是打开一个未初始化的文件并扫描以下变量。我试图找出它在做什么,但我不明白FSYM和ISYM格式化(?)正在尝试做什么,除了可能将它们声明为float或int字符串。

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
   );

行是打开文件的第一行,然后将其扫描到变量中。关于发生了什么的任何想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这是预处理器字符串连接。必须将它们定义为其他地方的字符串;当cpp命中多个相邻的字符串时,它将它们连接在一起,因此代码使用预处理器从预定义的部分构建一个更长的字符串。