【问题标题】:Reading formatted file containing different types读取包含不同类型的格式化文件
【发布时间】:2022-01-08 19:50:16
【问题描述】:

我正在尝试从以下格式的文件中读取:

12,6:23.4

我需要分别收集 12、6 和 23.4,但我似乎无法绕过逗号和冒号。

这是我的尝试:

int x = fscanf(fp, "%d %[^,] %d %s %f", &int_var, comma_buffer, &int_var_2, colon_buffer, &float_var);

但我得到如下垃圾输出:

int_var_1: 12

Comma_buffer: ��#� 

int_var_2:  0.000000 

colon buffer: , 

float_var: 0.000000

【问题讨论】:

  • 试试"%d ,%d :%f"
  • 老实说,这比我预期的要简单得多。希望我的讲师指出这一点,谢谢
  • int_var_2: 0.000000 发生是因为 , 从未被读取,扫描停止并且代码在打印之前没有检查返回值。
  • 是的,抱歉,逗号实际上是我原始代码输出中遗留下来的东西。

标签: c file c11


【解决方案1】:

"%d,%d:%f"等格式使用','':'。考虑在固定字符之前添加一个空格以容忍可选的空格:"%d ,%d :%f"


从文件中读取的最佳方式是fgets(),然后解析。

考虑使用" %n" 检测尾随垃圾。

#define LINE_SZ 100
char buf[LINE_SZ];

if (fgets(buf, sizeof buf, fp)) {
  int n = 0;
  sscanf(buf, "%d ,%d :%f %n", &int_var, &int_var_2, &float_var, &n);
  if (n == 0 || buf[n]) {
    puts("failed to parse all or extra junk.");
  } else {
    printf("%d,%d:%f\n", int_var, int_var_2, float_var);
  }
}

"%[^,]""%s" 都应该从不使用,因为它们缺少 宽度,这是健壮的代码始终使用的东西。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多