我的代码在法语和英语计算机之间的可移植性存在问题。事实上,英语使用点来分隔双精度,就像法语使用逗号一样。问题是我无法在法国计算机上阅读用英文(带点)写的数字,因为它需要一个逗号。
有什么好方法吗?
我虽然关于制作法语和英语文件,但我认为应该存在更好的解决方案
我的双线代码实际上是:
errcd *= fscanf(file, "%lf\n", &N->biais1->l[i]);
我的代码在法语和英语计算机之间的可移植性存在问题。事实上,英语使用点来分隔双精度,就像法语使用逗号一样。问题是我无法在法国计算机上阅读用英文(带点)写的数字,因为它需要一个逗号。
有什么好方法吗?
我虽然关于制作法语和英语文件,但我认为应该存在更好的解决方案
我的双线代码实际上是:
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);
使用语言环境是处理不同数字格式变化的标准方法。不幸的是,标准功能并不完整。
您可以将数字读取为字符串,然后将其转换为双精度......
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);