我正在处理的代码是打开一个未初始化的文件并扫描以下变量。我试图弄清楚它在做什么,但我不明白 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
);
line 是打开文件的第一行,然后扫描到变量中。关于正在发生的事情有什么想法吗?
最佳答案
大概,它们是在您的代码某处定义的宏,它们扩展为包含 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
关于c++ - 这个 sscanf 在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16799064/