2

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

有什么好方法吗?

我虽然关于制作法语和英语文件,但我认为应该存在更好的解决方案

我的双线代码实际上是:

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

2 回答 2

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

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

于 2016-12-04T22:12:18.140 回答
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);
于 2016-12-04T22:13:52.563 回答