繁体   English   中英

当此值使用逗号而不是点时,如何读取浮点值?

[英]How do i read a float value when this value have comma instead of dot?

我有一个CSV文件,其中的值用逗号分隔,如下所示:

224,321,345,56.6
225,322,245,46.7
etc,etc,etc.....

所有值都必须视为浮点数。

问题是当我尝试将值读取为浮点数时:

fscanf(file,%f,&value);

如果我打印结果

printf("The first value is: %f",value) 

我得到:

The first value is 224,321

当此值使用逗号而不是点时,如何读取浮点值?

简单的答案:格式不明确。 醚报价值或通过选择其他分隔符(可能是分号)消除歧义

另一个答案(如果浮点值没有逗号):切换到“ C”语言环境。

您的帖子有点模棱两可。 您说过,在文件中您有用逗号分隔的值,然后说要读取具有逗号而不是点的浮点值。

无论如何,默认行为是将逗号作为分隔符,因此读取123,324就像123.00一样。 但是,在下面的阅读中,您将获得相同的值。 因此,您可能需要这样写:

fscanf(file,"%f, ",&value);

如果要使用逗号而不是点分隔符(虽然我看到您使用点分隔符有一些值),则需要在文件中使用另一个分隔符(例如空格)来分隔两个连续的值。 您指定的文件不能像这样使用。

我对编码有点陌生,但是您难道不能先删除逗号然后再阅读吗? 只需使用贯穿行并消除所有逗号的函数即可。 这对我来说似乎是最简单的解决方案。

CVS格式包含一堆用逗号分隔的数据。 因此,当您尝试解析cvs文件时,必须将逗号符号作为scanf函数中format参数的一部分。 我相信以下代码会有所帮助。

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;

int main(int argc, char * argv[]) {
    if(argc <= 1) {
        printf("No file specified!\n");
        exit(0);
    }
    char * filename = argv[1];
    FILE *file = fopen(filename,"rb");
    if(0 != file) {
        float value = 0;
        while(!feof(file)) {
            fscanf(file, "%f,", &value);
            printf("%f ",value);
        }
        printf("\n");
    }
    fclose(file);
    return 0;
}

是否将逗号视为小数点分隔符取决于语言环境。 您已经为C和C ++标记了此标签; 在这种情况下,解决方案是不同的。

在C ++中,忘记fscanf并使用std::istream 然后用std::locale("C")注入流。

在C语言中,这要困难得多,因为您必须更改全局语言环境。 并且几乎可以肯定地将其还原。 而且,如果您是多线程的,请在关键部分执行此操作,以免其他任何人也想要修改语言环境。

C解决方案

OP的scanf()显然使用了浮点decimal_point "," 不幸的是,数据使用的decimal_point"."

C解决方案包括4个步骤:1)确定当前语言环境2)更改语言环境3)调用sscanf() 4)恢复语言环境。

#include <locale.h>

// Maybe CurrentLocaleName = "" will work.
// That's the locale-specific native environment.
// Otherwise the value may be available in preceding code.
const char *CurrentLocaleName = TBD();  

// In the "C" locale, a decimal_point is ".".
if (NULL == setlocale(LC_NUMERIC, "C")) {
  handle_local_change_error();
}

if (first_in_line) {
  if (1 != fscanf(file, "%f", &value)) {
    handle_scan_error();
  }
}
else {
  if (1 != fscanf(file, " ,%f", &value)) {
    handle_scan_error();
  }
}

if (NULL == setlocale(LC_NUMERIC, CurrentLocaleName)) {
  handle_local_change_error();
}

一种方法是将其读取为整数,然后转换为浮点数。

另一方法是逐行读取,在逗号处分割,然后将每个数字一对一转换为浮点值。

这两个解决方案都具有非常不错且非常简单的C ++实现。 用C做更多的工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM