【问题标题】:Scanning from file two floats with hyphen between从文件中扫描两个带有连字符的浮点数
【发布时间】:2017-08-16 16:48:35
【问题描述】:

我正在尝试从带有两个浮点数的 .txt 文件进行扫描,它们之间有一个连字符。如果连字符被删除,代码就可以工作,但我正在为学校目的工作并且需要连字符。

该函数应该将文件中的信息加载到数组中。

代码如下:

#include <stdio.h>
#include <estruturas.h>
#include <funcoes.h>

void loadmedicos(medico *pmedico,int total){

    FILE *f;
    medico x; //medico is a typedefined struct with 2 floats
    f=fopen("medicos.txt","rt");

    if(f==NULL){
        printf("Ocorreu um erro ao abrir 'medicos.txt'!\n\n");
    }
    for(int i=0;i<total;i++){
        fscanf(f,"%f",&x.horarioentrada);
        fscanf(f,"%f",&x.horariosaida);
        *(pmedico+i)=x;
    }

    fclose(f);
}

如果 .txt 包含:

19.30 20.30

然后它将正确读取并输出这些数字。如果文件包含:

19.30-20.30

不会读取第二个数字。为什么会这样,我该如何解决?

【问题讨论】:

  • 也许scanf (and family) 参考可能有用?特别是关于格式字符串。任何good beginners book 或任何好的在线教程也应该告诉你。
  • 你怎么知道第二个数字不会被读取?您没有测试来自fscanf() 的返回值,所以您不知道这两种转换是否有效?目前尚不清楚您为什么不使用if (fscanf("%f-%f", &amp;x.horarioentrada, *x.horariosaida) != 2) { …oops; something went wrong… } — 'oops' 部分是使用fgets() 读取输入行并使用sscanf() 解析它变得更好;然后你可以更容易地看到是什么导致了麻烦。结构成员实际上是 float 类型的吗?
  • 您似乎对答案很满意,但我无法重现。包含您的19.3-20.3 的文本文件扫描并打印19.299999 -20.299999。我知道您不想扫描 -,但我没有收到“第二个号码将不会被读取。”
  • 请注意,如果您打开文件失败,您会报告错误,但随后继续使用空文件指针,这可能会崩溃并且肯定无法正常工作。报告问题很好;如果错误消息标识了无法按名称打开的文件,则更好;如果您确保不使用失败的文件流(在fclose() 调用的for 循环中),则更好的是,一旦您确定存在问题。
  • 起初它不起作用,但如果你在 txt 文件和 fscanf 行中有空格,它对我来说很好。文件:13.30 - 20.30 行:fscanf(f,"%f - %f",&x.horarioentrada,&x.horariosaida);

标签: c file scanf hyphen


【解决方案1】:

您需要在scanf 格式中包含“-”字符。这样,字符就被跳过了:

fscanf(f, "%f-%f", &x.horarioentrada, &x.horariosaida);

【讨论】:

  • 负数很好——使用问题中的代码(不是你的答案),19.30-20.30 应该读作 +19.30 和 -20.30 没有问题,不是吗?请注意,这并不是对修复提出异议(这是我所期望的,给予或接受检查函数调用的结果);只是不清楚诊断是否正确。
  • @JonathanLeffler 它被读取为 +19.30 和 +20.30。这是假设连字符是分隔符。
  • 是的——我已经澄清了我的评论,询问为什么您对问题中代码的诊断是正确的;我仍然不否认您的建议是解决问题的方法。
  • @JonathanLeffler 按照我的阅读方式,该文件包含用连字符分隔的数字。关于“如果连字符被删除,代码就可以工作”的部分听起来像是 OP 的实验,并通过“但我正在为学校目的并且需要连字符”来加强。
  • 鉴于 OP 对答案很满意,这就是我的建议,我们可以让它平息。我仍然不高兴我不明白为什么原始代码“不起作用”——或者它是如何被认为不起作用的。但修复似乎有效,对我来说很好。所以,让睡狗躺着吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
相关资源
最近更新 更多