首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件读取困难

文件读取困难
EN

Stack Overflow用户
提问于 2016-10-30 16:56:09
回答 2查看 50关注 0票数 0

所以我认为这应该是非常直接的。实际上,我甚至无法理解什么可能会出错,这也是最让我困扰的地方。

事情是这样的:我必须从一个文件中读取几个数字,但这些数字是用科学符号表示的。示例文件中的数字如下所示:

代码语言:javascript
复制
1.00090E+00,2.90000E+00

所以我想我只需要这样读:获得一个双,忽略一个字符,得到一个int,忽略一个字符,得到另一个双,忽略一个字符,得到一个最后的int,所以对于这个例子,它会:

代码语言:javascript
复制
get (1.00090)
ignore (E)
get (+00)
ignore (,)
get (2.90000)
ignore (E)
get (+00)

所以,我写了这些fscanf:

代码语言:javascript
复制
fscanf(arquivo, " %lf%*c%d%*c", &mantissa1, &expoente1);
x[i] = numToFloat(mantissa1, expoente1);
fscanf(arquivo, "%lf%*c%d", &mantissa2, &expoente2);
fx[i] = numToFloat(mantissa2, expoente2);

我把他们分开让理解更简单。但那样的话,就不管用了。它正确地读取了第一个双变量,但随后却把int弄乱了。然后它就把第二次扫描上的一切都搞砸了。我试过我能想到的一切。将格式化的字符串放到fscanf ("%lfE%d,""%lfE%d")上。将信号读入字符变量("%lf%*c%c%d%*c")。都不管用。

有什么不对的猜测吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-30 17:05:53

首先,不需要分别解析尾数和指数。scanf本机理解n.nnnE±nnn表示法。这就是为什么您的格式字符串不像预期的那样运行的原因;%lf指令消耗包括E+00段在内的整个第一个数字,然后%*c使用逗号,%d %d 2,现在我们完全失去了同步。

第二, functions, ever。相反,一次用fgets (或者getline,如果有)读一行,用strtok在逗号上拆分它,用strtod将数字转换成二进制(这也可以理解科学的符号)。这将是更多的预先编码,但结果将更容易阅读和调试,它将更容易使其对格式错误的输入健壮,它将有良好的行为,在输入溢出。

(从技术上讲,您不需要使用strtok,因为strtod会告诉您每个数字的结束位置,但从概念上来说,先进行拆分比较简单。)

票数 1
EN

Stack Overflow用户

发布于 2016-10-30 17:06:01

您可能可以根据您的需要修改此示例,它使用了%lg格式说明符:

代码语言:javascript
复制
#include <stdio.h>

int main(void){
    double d, e;
    int n;
    printf("Enter 2 scientific floats: ");
    fflush(stdout);
    n = scanf("%lg %*c %lg", &d, &e);
    if(n == 2) {
        printf("%f\n", d);
        printf("%f\n", e);
    } else {
        printf("Bad input\n");
    }
}

程序会话

代码语言:javascript
复制
Enter 2 scientific floats: 1.8e+4,4.2e-1
18000.000000
0.420000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40331406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档