Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用fscanf在英语和法语朗文上读双字_C_Internationalization_Double_Scanf_French - Fatal编程技术网

用fscanf在英语和法语朗文上读双字

用fscanf在英语和法语朗文上读双字,c,internationalization,double,scanf,french,C,Internationalization,Double,Scanf,French,我的代码在法语和英语计算机之间的可移植性有问题。事实上,英语使用point来分隔double,就像法语使用逗号一样。 问题是,我无法在法国计算机上读取英文数字(带点),因为它需要逗号 做这件事的好方法是什么 我想制作一份法文和英文文件,但我认为应该有更好的解决办法 我的双精度线代码实际上是: errcd *= fscanf(file, "%lf\n", &N->biais1->l[i]); 更改区域设置 一些让你开始的伪代码 #include <locale.h>

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

做这件事的好方法是什么

我想制作一份法文和英文文件,但我认为应该有更好的解决办法

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

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
#包括
获取当前区域设置(`*localeconv()`)
每行
将行读入缓冲区。
使用`strtod()进行转换`
如果转换失败并且有尾随字符
开关(失败字符)
“.”:将语言环境设置为英语(`setlocale()`),然后重试
“,”:将区域设置设置为法语,然后重试
恢复原始区域设置

比如:

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);
char*locale\u original=setlocale(LC\u ALL,NULL);
char*locale_english=。。。;
char*locale_法语=。。。;
char-buf[100];
尺寸i=0;
而(ibiais1->l[i]=strtod(buf,&endptr);
如果(endptr!=buf){
开关(*endptr){
大小写“.”:locale_original=setlocale(LC_ALL,locale_english);break;
案例“,”:locale_original=setlocale(LC_ALL,locale_english);break;
违约:
handle_error();
打破
}
N->biais1->l[i]=strtod(buf,&endptr);
如果(*endptr){
handle_error();
打破
}
}
}
setlocale(LC_全部,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]==\0) break;
}
N = atof(dummy);
intn;
双N;
伪字符[100];
fscanf(“%s”,虚拟);

对于(n=0;我确实喜欢这种方法的简单性-如果OP的要求只是扫描
而不是
字符串,那就很好了。@chux您的区域设置方法太棒了……但我在法国工作,从来没有遇到过这个问题,但当时我没有用Franceje suis super content que ca marche pour vous-il n'y a pas de quoi编写代码请注意,这不是一个英文版与法文版的版本,而是一个“
”、“
”的版本。
代表小数点。