我有一个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
当此值使用逗号而不是点时,如何读取浮点值?
答案 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中做更多的工作。