[英]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.