2016-12-04 87 views
1

我的法語和英語電腦之間的代碼可移植性存在問題。事實上,英語使用點來分隔雙倍,因爲法語使用逗號。 問題是我無法在法語電腦上看到用英文寫的數字(帶點),因爲它需要逗號。用英語和法語朗讀fscanf的雙語朗朗

這樣做的好方法是什麼?

我雖然有關使法語和英語文件,但我認爲一個更好的解決方案應該存在

我的代碼與雙行居然是:

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

注意這不是一個英語與法語的問題,而是'「」'VS小數點。「。」。 [參考](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 ','串。 – 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); 

使用區域是處理不同的數字格式變化的標準方式。不幸的是,標準功能並不完整。