【问题标题】:Using sscanf for reading data separated by |使用 sscanf 读取由 | 分隔的数据
【发布时间】:2015-10-05 16:09:23
【问题描述】:

我必须从 .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”,我错误地丢弃了它。我的问题是,我怎样才能读取这些数据?

注意:我的数据集中有很多列,还有其他“奇怪的数据”需要丢弃。

最好的问候。

【问题讨论】:

    标签: c file scanf


    【解决方案1】:

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

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

    要了解"%*[^|]" 的含义/确实是什么,请阅读scanf(3) 的手册页。


    1使用有意义的变量名,在今天的文本编辑器中,自动完成功能将帮助你很多,有意义的变量名将使程序在几个月内易于理解/ 几周后,当您出于某种原因(维护、重用)重新使用它时。

    【讨论】:

    • 我不能和你争论@chux 你是scanf()的专家。
    【解决方案2】:

    改为这样写-

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-16
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-11
        • 2016-08-19
        • 2018-05-06
        相关资源
        最近更新 更多