我有一个 .dad 文件,内容如下
1/2
我希望从文件中读取并将值保存0.5
到double
使用中fscanf
,但该方法将其读取为1.000
。
为了完全清楚,这里是代码和输出:
#include <stdio.h>
int main(void){
/* Open the file */
FILE * file ;
file = fopen ("test.dad", "r");
if ( file == NULL ){
printf("Error opening %s\n", ".dad file.");
return 1;
}
/* Import data to x */
double x = 0;
fscanf(file, "%lf", &x);
fclose(file);
/* Print x */
printf("%lf\n", x);
return 0;
}
输出:
1.000000
4
最佳答案
2
您得到的是,1.0
因为它仅成功解析1
了1/2
。它不知道如何处理/
。在这种情况下,您需要读取两个相隔的整数/
,然后使用double
精度将它们相除。
例子:
#include <stdio.h>
int main(void) {
char line[] = "1/2";
int num, denom;
if (sscanf(line, "%d/%d", &num, &denom) == 2) {
double x = (double)num / (double)denom;
printf("%lf\n", x); // prints 0.5
}
}
|
-
scanf
不计算任何表达式。它只读取(在你的情况下为浮点型)常量 -
如果要评估以字符串形式输入的表达式,则需要使用第三方库 – 例如 tinuExpr
例如:
int main(void)
{
char str[100];
fgets(str, sizeof(str), stdin);
printf("Result: %f\n", te_interp(str, 0));
}
当你输入1/2
结果时0.500000
你的表达:
|
(number)/(number)
。您必须自己构建它。–
fscanf
被告知要读取一个浮点值。它读取了1
,下一个字符是非数字(/
),因此它停止并正确读取值1.0
。您需要读取表达式并自己执行数学运算1
以除以2
得到0.5
。–
/
,那么您可以分别读取两个数字,然后自行执行除法。–
/
,而没有其他内容(甚至没有空格)?或者您是在问如何处理任何类型的数学表达式5 * 3 / 2 + 5
?请您的问题以澄清这一点。–
|