读取包含多行字符串,整数和浮点数的文件

时间:2019-04-07 17:54:04

标签: c

我正在尝试读取一个包含一行的文件,该行包含一个字符串,整数和浮点数。数据之间用逗号分隔,并且我已经看到了大量有关如何最好地解决此问题的信息。我先尝试读入一行,然后再实现多行,从而简化了问题。

我设法读取了前两个数据。浮动给了我麻烦。

以下是我要阅读的示例:

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个。

我在做什么错了?

1 个答案:

答案 0 :(得分:2)

没有这样的说明符,例如"%u[^,]"。该格式被视为单独的"%u",然后是单独的"[^,]"

%[格式仅读取字符串,没有任何类型前缀(并且不需要,因为scanf将停止在输入的第一个非数字字符处读取整数)。这意味着您只能将"%u"用作中间说明符:

c = fscanf(fp, " %[^,], %u, %lf", CHANNEL_NAME_, &val1_, &val2_);

请注意,我在格式字符串中添加了一个前导空格。这是因为"%["格式不会跳过前导空格(就像上一行之后的任何可能的换行一样)。


使用格式说明符"%u[^,]",该函数实际上尝试匹配输入中的确切序列"[^,]",但找不到该序列,导致无法读取最后一个值。因此,c的值为2(因为fscanf仅匹配两个值,即初始字符串和第一个无符号整数)。