Двойное чтение с помощью 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);

Использование локали является стандартным способом обработки вариаций в различных числовых форматах. К сожалению, стандартные функции не так полны.

Другие вопросы по тегам