【问题标题】:Parsing Integer and Float Values of a Text File with sscanf使用 sscanf 解析文本文件的整数和浮点值
【发布时间】:2013-09-10 07:18:14
【问题描述】:

我想将带有这些字段的此类文件解析为整数和浮点变量,我尝试使用 fscanf、strtok、sscanf 来执行此操作。但它们都不起作用!

文件的一些行:

fed18 5.7 12.7 144997 8087 267345 100776
fedora18 24.9 25.3 253566 10501 126282 118157
fed18 5.9 12.7 145005 8094 267345 100785
fedora18 23.3 25.3 253576 10507 126282 118169
fed18 6.2 12.7 145013 8100 267345 100789

运行以下代码返回错误值!我不知道我搜索的问题是什么,每个人都使用这样的代码并且它对他们来说正常工作!

 while(fgets(str,512,fp)!= NULL)//read file line by line
{
char *tokenstring = str;
uint64_t netrx,nettx,vbd_rd,vbd_wr;
double cpu, mem;
char a[10],b[10],c[10],d[10],e[10],f[10],g[10];
   sscanf(tokenstring, "%s ,%[^' '],%[^' '],%[^' '],%[^' '],%[^' '],%[^' ']",g, a, b, c, d, e, f);
   cpu = atof(a);
   mem = atof(b);
   nettx  = atoi(c);
   netrx  = atoi(d);
   vbd_rd  = atoi(e);
   vbd_wr  = atoi(f);
   printf("%s %f %f %ld %ld %ld %ld\n",g,cpu,mem,netrx,nettx,vbd_rd,vbd_wr);
}
fclose(fp);

这是输出:

fed18 38.000000 1.000000 0 0 0 0
fedora18 38.000000 1.000000 0 0 0 0
fed18 38.000000 1.000000 0 0 0 0
fedora18 38.000000 1.000000 0 0 0 0
fed18 38.000000 1.000000 0 0 0 0

我使用 bash 脚本并使用 awk 编辑了原始文本文件,.... 原始行采用以下格式:

     fed18 --b---       3616    6.3    1052640   12.7    1052672      12.7     3    1   125864     6023    1        0   254349    93082    7412662    4730752    0
  fedora18 --b---       4711    2.4    2101216   25.3    2101248      25.3     3    1   249151     8636    1        0   126083   113505    3306934    5992656    0

我使用 bash 脚本选择了一些列。 也许这导致了问题!

我注释了使用函数atoiatof的行,但仍然输出错误的值。

【问题讨论】:

  • 作为一种调试方法,您是否尝试在 ato{i,f} 转换之前检查字符串 a,b,c,d,e,f(例如,使用打印语句或调试器)。跨度>
  • @cmh: 是的,我告诉过我这样做了,它输出不同但仍然错误的值。我看到 sscanf 返回 1!这意味着它只能读取第一个值。我尝试替换 @987654328 @ 与 %d%f 但没有效果!

标签: c parsing scanf


【解决方案1】:

如果您总是希望参数之间有一个空格,您可以简单地使用您的格式字符串并避免使用atoiatof

while(fgets(str,512,fp)!= NULL)//read file line by line
{
    char *tokenstring = str;
    uint64_t netrx,nettx,vbd_rd,vbd_wr;
    char g[10];
    double cpu, mem;
    long int c, d, e, f;
    sscanf(tokenstring, "%s %lf %lf %lu %lu %lu %lu", g, &cpu, &mem, &nettx, &netrx, &vbd_rd, &vbd_wr);
    printf("%s %f %f %ld %ld %ld %ld\n",g,cpu,mem,netrx,nettx,vbd_rd,vbd_wr);
}
fclose(fp);

【讨论】:

    【解决方案2】:

    您的格式字符串包含输入中不存在的逗号。也就是说,您应该使用%lf 将浮点数解析为double,并使用%lu 解析为uint64_t

    请注意,当当前语言环境不是英语时,您可能会遇到麻烦,因为这会影响 C 期望作为小数点的字符。使用setlocale(LC_NUMERIC, "C"); 来解决这个问题。

    【讨论】:

      【解决方案3】:

      scanf 是为解析数字而设计的,所以不需要使用atoi,所以只需使用带有适当参数的 sscanf 即可

      int result = sscanf(tokenstring, "%s %lf %lf %lld %lld %lld %lld",g, &cpu, &mem, &netrx, &netrx, &vbd_rd, &vbd_wr);
      assert( result == 7 ) ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-23
        • 2020-06-18
        • 1970-01-01
        • 2017-08-05
        • 2013-02-27
        • 1970-01-01
        相关资源
        最近更新 更多