2016-12-04 20 views
1

フランス語と英語のコンピュータ間でコードの移植性に問題があります。実際、フランス語はカンマを使用するため、英語ではポイントを使用して二重に区切ります。 問題は、カンマが必要なため、フランス語のコンピュータで英語で書かれた数字(ポイント付き)を読むことができないということです。英語とフランス語の両方でfscanfでダブルを読むLANG

どうすればよいですか?フランス語と英語のファイルを作成するが、私はよりよい解決策は、ダブルとラインの

私のコードを存在するはずだと思う程度

私も実際には次のとおりです。

errcd *= fscanf(file, "%lf\n", &N->biais1->l[i]); 
+0

注これは英語対フランスの問題ではありませんが、 '「」'対小数点以下は「。」とします。 [Ref](https://en.wikipedia.org/wiki/Decimal_mark#Hindu.E2.80.93Arabic_numeral_system) – chux

答えて

1

あなたは文字列としての数字を読み、その後、二重にそれを変換することができ....

int n; 
double N; 
char dummy[100]; 
fscanf("%s",dummy); 
for (n=0;n<100;n++) 
{ /* here you need to make a conversion , to . (or . to ,) */ 
    if (dummy[n]==',') dummy[n]='.'; 
    if (dummy[n]==\0) break; 
} 
N = atof(dummy); 
+0

私はこのアプローチの単純さが好きです。OPの要件が '.''vs '、' string。 – chux

+0

@chuxあなたの*ロケール*アプローチは素晴らしいです...しかし、私はフランスで働いていましたが、これを問題として見たことはありませんでしたが、私はフランスでコーディングしていませんでした – tom

+0

非常にシンプルで、私はそれを好きでした:) –

1

変更ロケール

いくつかの疑似コードを使用してください。

#include <locale.h> 

get current locale (`*localeconv()`) 
for each line 
    read line into buffer. 
    convert using `strtod()` 
    if it fails to convert and has a trailing character 
    switch(failing character) 
     '.' : set locale to English (`setlocale()`) and try again 
     ',' : set locale to French and try again 
restore original locale 

ような何か:ロケールを使用して

char *locale_original = setlocale(LC_ALL, NULL); 
char *locale_english = ...; 
char *locale_french = ...; 

char buf[100]; 
size_t i = 0; 
while (i < max && fgets(buf, sizeof buf, file) != NULL) { 
    char *endptr; 
    N->biais1->l[i] = strtod(buf, &endptr); 
    if (endptr != buf) { 
    switch (*endptr) { 
     case '.': locale_original = setlocale(LC_ALL, locale_english); break; 
     case ',': locale_original = setlocale(LC_ALL, locale_english); break; 
     default: 
     handle_error(); 
     break; 
    } 
    N->biais1->l[i] = strtod(buf, &endptr); 
    if (*endptr) { 
     handle_error(); 
     break; 
    } 
    } 
} 
setlocale(LC_ALL, locale_original); 

は異なる数値形式のバリエーションを処理するための標準的な方法です。残念ながら、標準機能は完全ではありません。

関連する問題