在英语和法语 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);
我的代码在法语和英语计算机之间的可移植性有问题。事实上,英语使用点来分隔双精度数,而法语使用逗号。 问题是我无法在法语计算机上读取用英语(带点)写的数字,因为它需要一个逗号。
这样做的好方法是什么?
我想制作一个法语和一个英语文件,但我认为应该有更好的解决方案
我的双精度代码实际上是:
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);