在英语和法语 LANG 上使用 fscanf 进行双重阅读

Reading double with fscanf on both english and french LANG

我的代码在法语和英语计算机之间的可移植性有问题。事实上,英语使用点来分隔双精度数,而法语使用逗号。 问题是我无法在法语计算机上读取用英语(带点)写的数字,因为它需要一个逗号。

这样做的好方法是什么?

我想制作一个法语和一个英语文件,但我认为应该有更好的解决方案

我的双精度代码实际上是:

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

更改语言环境

一些伪代码可以帮助您入门。

#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);

使用 locale 是处理不同数字格式变化的标准方法。不幸的是,标准功能并不完整。

您可以将数字作为字符串读入,然后将其转换为双精度数....

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]==[=10=]) break;
}
N = atof(dummy);