繁体   English   中英

如何根据变量类型选择fscanf格式?

[英]How to choose fscanf format based on the type of the variable?

假设我正在实现一个矩阵,并且希望我的结构使用scalar_t ,其中scalar_t可以是floatdouble

然后,假设我要扫描一些文本文件并将其加载到矩阵中:

// Inner loop:
fscanf(mdata, format, &m->data[i * m->cols + j]);

如果scalar_t *float * ,则format应为"%f" 如果为double *"%lf"

如何根据scalar_t的类型设置scalar_t 我知道我可以比较sizeof但是有一个通用的解决方案吗?

C99的<inttypes.h>的设计人员也遇到了类似的问题。 他们使用一些特定的属性定义了诸如int32_t类的类型,并允许每个实现将其typedef定义为int或所需的long 但是后来printf和scanf格式成为特定于平台的格式。

他们的解决方案是为每种类型定义一组宏,例如SCNd32 ,将其为"d""ld"以匹配typedef的intlong

用法看起来像

int32_t i;
scanf("%"SCNd32, &i);

对于每种类型,对于您可能要与该类型进行的每次转换,都有一个单独的宏(因此,不仅是d而且还有x代表十六进制,等等)

您可以对自定义类型执行相同的操作。 在标题中:

#if something
typedef float scalar_t;
#define SCNfSCALAR "f"
#else
typedef double scalar_t;
#define SCNfSCALAR "lf"
#endif

并在调用代码中:

scalar_t x;
scanf("%"SCNfSCALAR, &x);

鉴于

  1. 您将需要一个union ,有一个floatdouble

  2. C标准要求doublefloat的超集。

  3. 尽管要求平台是独立的类型,但越来越多的平台将floatdouble设置为相同的类型,在很多方面, charunsigned charsigned char始终是三种独立的类型。

到目前为止,最好的方法是使用double

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM