1

プロジェクトの C++ ソースの 1 つにばかげたバグがあります。ソース I/O 操作のこの部分で行います。fscanf の読み取り値を出力する愚かなバグがあります。この部分の下: まず、適切な値を読み取らず、float 値を出力すると、ポイント '.' の代わりにコンマ ',' を使用して 10 進数値が取得されます。整数部分と浮動部分の間。

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

こんなバグは初めてです。誰が何が悪いのか見ることができますか?

4

3 に答える 3

2

あなたのC++ロケールはどういうわけかヨーロッパの慣習を使用するように設定されていますか?千の区切り文字にポイントとポイントを使用する場合は、コンマを使用します。

環境変数の設定を見てください

LANG LC_CTYPE LC_ALL

en_GBまたはen_USを設定してみてください。これがロケールの問題であることを確認したら、次に、どのような動作が意味をなすかを決定します。1224,45の表示はまったくバグですか?ユーザーが理由でロケールを設定しています。

于 2012-11-21T09:26:03.843 に答える
1

プログラム環境に設定されたロケールを使用するコードを使用しています。フランス語圏のロケールなど、一部のロケールでは、カンマが小数点記号です。したがって、このコードは、そのロケールがおそらく指示していることを実行しています。

単純なコードでは、ロケール サポートを初期化していないため、これは発生しません。

Unix ライクな環境を仮定すると、環境変数 LANG とさまざまな LC_* 環境変数の値は?

環境 | grep -e ^LANG -e ^LC_

背景を読むには、GNU Libc マニュアル (ロケールと国際化) を試してください。

http://www.gnu.org/software/libc/manual/html_node/Locales.html#Locales

于 2012-11-21T09:41:37.243 に答える
0

私の推測では、アプリケーションはロケールをユーザーの好みに合わせてstd::locale::global( std::locale( "" ) ). これは 、常にコンソール アプリケーションが行うべきことです。彼らはまた、このロケールで をstd::cin吹き込むstd::cout必要 があります。std::cerrほとんどの言語コミュニティでは、小数点ではなく小数点にコンマを使用します。(デーモン プロセスの場合、多くの場合、サーバーが実際に実行されている場所に関係なく"C"、ロケール、または"Posix"Unix のロケールを使用する方が適切です。"C"ロケールはデフォルトであるため、通常、デーモンとサーバーでは何もしなくても問題ありません。)

グローバル ロケールは、すべてのC スタイルの入力と出力に影響します。これは、代わりに C++ の iostream を使用するもう 1 つの理由です。では std::ifstream、最初の入力を行う前に、ファイルが書き込まれたロケールをストリームに吹き込むだけです。マシン生成ファイルの場合、"C"ロケールは通常のデフォルトであるため、コードは次のようになります。

std::ifstream file3( "test.dat" );
if ( ! file3.is_open() ) {
    //  error handling...
}
file3.imbue( std::locale( "C" ) );
float test1;
file3 >> test1;
//  ...

端末への出力については、ロケールの規則に従う必要があります。そして、環境変数を設定して、表示したいロケールを指定します。

于 2012-11-21T10:11:31.187 に答える