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

时间:2013-11-15 18:15:29

标签: c++ c csv scanf

我有一个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

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

7 个答案:

答案 0 :(得分:1)

简单回答:格式含糊不清。以太引用值或通过选择不同的分隔符(可能是分号)来消除歧义

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

答案 1 :(得分:0)

你的帖子有点含糊不清。 你说在你的文件中你有用逗号分隔的值,之后你说你想要读取一个逗号而不是点的浮点值。

无论如何,默认行为是将逗号作为分隔符,因此123,324被加为123.00。但是,在下面的阅读中,您将得到相同的值。所以,你可能想这样写:

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

如果你想使用逗号作为分隔符而不是点(尽管我看到你有一些使用点的值),那么你需要在文件中使用另一个分隔符(如空格)来分隔2个连续值。您指定的文件不能像这样使用。

答案 2 :(得分:0)

我对编码有点新意,但你不能先删除逗号然后再读它吗?只需使用贯穿该行的功能并消除所有逗号。这对我来说似乎是最简单的解决方案。

答案 3 :(得分:0)

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

#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;
}

答案 4 :(得分:0)

逗号是否被视为小数点分隔符 取决于区域设置。你已经为C和C ++标记了这一点; 在这种情况下,解决方案是不同的。

在C ++中,忘记fscanf并使用std::istream。然后 用std::locale("C")灌输您的信息流。

在C中,它要困难得多,因为你必须改变全局 语言环境。几乎肯定会恢复它。如果你是的话 多线程,在关键部分这样做,受到保护 其他任何可能想要修改语言环境的人。

答案 5 :(得分:0)

C解决方案

OP scanf()显然使用decimal_point的浮点","。不幸的是,数据使用decimal_point的{​​{1}}。

C解决方案有4个步骤:1)确定当前区域设置2)更改区域设置3)调用"." 4)恢复区域设置。

sscanf()

答案 6 :(得分:-1)

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

另一种是逐行读取,以逗号分割,并将每个数字逐个转换为浮点值。

这两种解决方案都有非常好的和非常简单的C ++实现。在C中做更多的工作。