Двойное чтение с помощью fscanf на английском и французском языках
У меня проблема с переносимостью моего кода между французским и английским компьютерами. Действительно, английский использует точку для разделения двойного, а французский использует запятую. Проблема в том, что я не могу прочитать число, написанное на английском (с точкой) на французском компьютере, потому что оно ожидает запятую.
Какой хороший способ сделать это?
Я думаю о создании французского и английского файла, но я думаю, что лучшее решение должно существовать
Мой код для строки с двойным на самом деле:
errcd *= fscanf(file, "%lf\n", &N->biais1->l[i]);
2 ответа
Вы можете прочитать число в виде строки символов, а затем преобразовать его в двойное....
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);
Сменить локаль.
Некоторый псевдокод, чтобы вы начали.
#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);
Использование локали является стандартным способом обработки вариаций в различных числовых форматах. К сожалению, стандартные функции не так полны.