我正在尝试读取一个包含一行的文件,该行包含一个字符串,整数和浮点数。数据之间用逗号分隔,并且我已经看到了大量有关如何最好地解决此问题的信息。我先尝试读入一行,然后再实现多行,从而简化了问题。
我设法读取了前两个数据。浮动给了我麻烦。
以下是我要阅读的示例:
CHANNEL_1,0,0.453
char CHANNEL_NAME_[BUF_SIZE];
uint32_t val1_;
double val2_;
FILE *fp;
int c;
fp = fopen("E:\\read_from_file\\config.cfg", "r");
if (fp < 1)
{
printf("Failed to open file = %d\n", fp);
fclose(fp);
}
c = fscanf(fp, "%[^,], %u[^,], %lf", CHANNEL_NAME_, &val1_, &val2_);
printf("[%s] [%u] [%lf]\n", CHANNEL_NAME_, val1_, val2_);
printf("C = %d\n", c);
我能够正确打印字符串和整数,但是,浮点数给我带来了问题。它以随机浮动的形式出现,例如34534524524523452345.0000000。我希望看到上述浮动值为0.453。
当我打印C时(这是fscanf的结果),由于读取了3种数据类型,我得到2个错误,因为我希望读取3个。
我在做什么错了?
答案 0 :(得分:2)
没有这样的说明符,例如"%u[^,]"
。该格式被视为单独的"%u"
,然后是单独的"[^,]"
。
%[
格式仅读取字符串,没有任何类型前缀(并且不需要,因为scanf
将停止在输入的第一个非数字字符处读取整数)。这意味着您只能将"%u"
用作中间说明符:
c = fscanf(fp, " %[^,], %u, %lf", CHANNEL_NAME_, &val1_, &val2_);
请注意,我在格式字符串中添加了一个前导空格。这是因为"%["
格式不会跳过前导空格(就像上一行之后的任何可能的换行一样)。
使用格式说明符"%u[^,]"
,该函数实际上尝试匹配输入中的确切序列"[^,]"
,但找不到该序列,导致无法读取最后一个值。因此,c
的值为2
(因为fscanf
仅匹配两个值,即初始字符串和第一个无符号整数)。