c++ - 这个 sscanf 在做什么?

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

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/

相关文章:

c++ - 因为调用RegOpenKeyEx导致一长串依赖关系正常吗?

c++ - boost::this_thread::get_id 在 exit() 调用期间不返回 id

c++ - 我应该如何将 placement new 与自定义分配 API 一起使用?

c++ - 常量值的静态分析

c++ - 类私有(private)成员 - 数组访问失败

c++ - QPluginLoader 实例总是返回 null

c++ - 用 fstream 在最后一行写

c++ - 在删除指向动态分配对象的指针 vector 中的元素之前,我需要做什么?

c++ - 简单的 C++ MIME 解析器

c++ - 目标与数组聚合时完美转发失败