我的一个项目c ++源代码中有一个愚蠢的错误。我在这部分源I / O操作中做了。我有一个愚蠢的错误,我打印fscanf读取值。以下部分: 首先,我没有读取好的值,当我打印浮点值时,我得到一个带逗号','而不是点''的十进制值。整数部分和浮动部分之间。
FILE* file3;
file3=fopen("test.dat","r");
float test1;
fscanf(file3," %f ",&test1);
printf("here %f\n",test1);
float test3 = 1.2345;
printf("here %f\n",test3);
fclose(file3);
其中test.dat
文件包含“1.1234”并执行:
here 1,000000
here 1,234500
所以,我做了一个用g ++编译的简单测试C程序:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* file3;
float test3;
file3=fopen("test.dat","r");
fscanf(file3,"%f",&test3);
printf("here %f\n",test3);
fclose(file3);
}
它给出了:
here 1.123400
这是我第一次遇到这样的错误。任何人都可以看到什么是错的?
答案 0 :(得分:2)
您的C ++语言环境是否设置为使用欧洲约定?他们使用逗号,我们使用点和点来分析千位分隔符。
查看环境变量的设置
LANG LC_CTYPE LC_ALL
尝试设置en_GB或en_US。确定它是一个语言环境问题后,接下来决定哪些行为是有意义的。是否将1224,45错误地丢弃?用户出于某种原因设置了区域设置。
答案 1 :(得分:1)
您正在使用使用为程序环境设置的区域设置的代码。在某些语言环境中,例如在讲法语的语言环境中,逗号是小数分隔符。因此,此代码正在执行其区域设置可能告诉它的内容。
在您的简单代码中,您尚未初始化语言环境支持,因此不会发生这种情况。
假设类Unix环境,环境变量LANG的值和各种LC_ *环境变量是什么?
env | grep -e ^ LANG -e ^ LC _
对于某些背景阅读,请尝试一些GNU Libc手册(区域设置和国际化)
http://www.gnu.org/software/libc/manual/html_node/Locales.html#Locales
答案 2 :(得分:0)
我的猜测是应用程序正在将语言环境设置为
用户首选项,std::locale::global( std::locale( "" )
)
。这是应该的控制台应用程序
总是;他们还应该充满std::cin
,std::cout
和
具有此区域设置的std::cerr
。大多数语言社区都在使用
十进制的逗号,而不是点。 (对于恶魔
进程,使用"C"
语言环境通常更合适,
或Unix下的"Posix"
语言环境,无论在哪里
服务器实际上正在运行由于"C"
语言环境是
默认情况下,无所事事通常对恶魔和
服务器。)
全局语言环境会影响所有 C样式的输入和输出
是使用C ++的iostream的另一个原因。同
std::ifstream
,只是在流中添加了语言环境
在第一次输入之前写入了文件。对于
机器生成的文件,"C"
语言环境是通常的默认语言,
所以你的代码会变成:
std::ifstream file3( "test.dat" );
if ( ! file3.is_open() ) {
// error handling...
}
file3.imbue( std::locale( "C" ) );
float test1;
file3 >> test1;
// ...
要输出到终端,请期望区域设置约定 紧随其后。并设置环境变量以指定 您想要查看的区域设置。