使用 sscanf 读取由 | 分隔的数据

Using sscanf for reading data separated by |

我必须从 .txt 文件中读取数据,这是数据示例:

1 |    SMAX 0.3848 | 0.234 | 0.15

我只对阅读第一、第三和第四列感兴趣(所以我想丢弃那个奇怪的 SMAX 0.3848)。到目前为止我有这个:

while(fgets(buffer, BUFFER_SIZE, fp) != NULL)
{
    sscanf(buffer, "%d | %*s | %lf | %lf", &id, &ra, &dec);
}

但是它不起作用,我认为这是因为 "SMAX 0.3848",我错误地丢弃了它。我的问题是,我该如何读取这些数据?

注意:我的数据集中有很多列,还有其他 "weird data" 我需要丢弃。

此致。

问题是 "%*s" 它在发现白色 space 时停止扫描,试试这个1

if (sscanf(buffer, "%d |%*[^|]|%lf |%lf", &id, &ra, &dec) == 3)
    /* proceed to use `id', `ra', `dec' */
else
    /* invalid line of input */

要了解 "%*[^|]" means/does 的内容,请阅读 scanf(3) 的手册页。


1使用有意义的变量名,使用今天的文本编辑器,自动完成功能将帮助您很多,有意义的变量名将使程序易于理解一些 months/weeks 稍后当您出于某种原因(维护、重用)返回它时。

而是这样写-

  if(sscanf(buffer, "%d | %*[^%|] | %lf | %lf", &id, &ra, &dec)==3){
  /*                      ^ this will read until | is not encountered and then discard it*/
  // do something
 }

阅读 "%s"(或其任何变体)将在 space 处停止阅读。