提前感谢你抽出时间来阅读我的问题。。。

/* Binary search for use with Gen_window.comp */
#include <stdio.h>

int main()
{
  char line[1000];
  double sig, E;

  FILE *fp, *fopen();
  fp = fopen("sig_data", "r");

  if (fp==NULL){
        printf("Error opening file!");
  }
  else {
        printf("Processing file...");
  }



  while( (fgets(line, 25, fp) != NULL) ){
        fscanf(fp, "%lf\t%lf", &E, &sig);
        printf("\nThe energy is: %lf eV\nThe corresponding cross section is: %lf barns\n",E, sig);
  }

}

文件中的数字格式为X.XXXXXX+X或X.XXXXXX-X。C是否有方法将其指定为输入?没有“e”是不是很麻烦。我找不到任何关于输入指数的文档,只返回指数。。。
我不需要它打印的确切格式,任何其他指数格式将是罚款。
我知道在我的%lf中应该有一些指定符和精度,或者应该是%e,但是我已经尝试了所有对我有意义的东西,所以我基本上是空白的。
谢谢你的帮助。

最佳答案

杰斯特和普林斯的回答大体正确,但有缺陷。确实没有办法使股票编号解析例程(*scanfatofstrtod)以您拥有的格式处理一个数字。然而,建议的解决办法是不好的。首先,我个人认为,*scanfato*不应该使用,因为它们对格式错误的输入的处理非常糟糕。更严重的是,十进制到浮点的转换需要扩展的精度算法来避免精度损失。strtod(这是应该用于此问题的例程)可以依赖于正确地执行此操作,但单独处理尾数和指数,然后以明显的方式组合它们并不是这样。你需要一个大于double的中间类型,你需要一个精确计算到最后一位的10次方幂,而pow并不能给你可靠的结果。
因此,我的建议是动态重写每一行,使其能够被strtod接受。
将每一行读入一对字符串缓冲区,在\t处拆分。我可以手工操作,但只要您只使用fscanf格式,您就可以使用%s格式。确保每个缓冲区至少有两个额外的可用空间字节。
扫描每个缓冲区中的+-。使用memmove将该字符串及其所有后续字节下移一个。将e插入标牌原始位置的缓冲区。(如果手动执行步骤1,则可以将此步骤与该步骤的循环结合起来。)
您现在拥有strtod可以处理的格式的数字。

10-07 17:07