这个扫描仪在做什么?
What is this sscanf doing?
我正在处理的代码是打开一个未初始化的文件并扫描以下变量。我想弄清楚它在做什么,但我不明白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
);
行是打开文件的第一行,然后扫描到变量中。知道发生了什么吗?
假设它们是在代码中定义的宏,它们扩展为包含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
这是预处理字符串连接。它们必须在其他地方定义为字符串;当CPP遇到多个相邻字符串时,它将它们连接在一起,因此代码使用预处理器从预定义的部分构建更长的字符串。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 可视化是什么是使用C 将附加扫描仪(Twain设备)列表列出到计算机的最佳方法
- 这个扫描仪在做什么?