【发布时间】: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", &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);