2014-10-03 100 views
0

我想写一个非常简单的代码来读取文件。然而在那个文件中,我有M_PI/2,这是pi/2。当我的代码读取该文件时,它将M_PI/2吐出0.000。我如何让我的程序读取为pi/2。C编程读取文件

#include<stdio.h> 
#include<math.h> 
#include<stdlib.h> 

int main() 
{ 
    FILE *infile; 
    infile = fopen("./test.txt","r"); 
    double p; 


    fscanf(infile, "%lf", &p); 

    printf ("%lf\n", p); 
} 


test.txt 
M_PI/2 
+0

我会在最后修正少数格式错误,但“编辑必须至少改变6个字符” - >那么,如果这是法律,那么我们可能想要不好的内容。就这样吧。 – JensG 2014-10-03 16:17:35

+1

读取文件不会导致对其内容进行评估。你唯一能从中得到的就是一串字节。 – Doval 2014-10-03 16:20:33

+0

这是我在这个平台上的第一个问题。无论如何,我修复了格式问题。有人可以帮我解决这个问题吗? – 2014-10-03 16:21:06

回答

1

你想其实读expressions没有数字。所以你想评估这些表达式(在某些环境中,它定义了变量的含义或binding)。

因此,如果您坚持保留您的要求,您需要评估者,即​​。

一种可能的方法是将嵌入一些现有解释,像LuaGuile

否则,你要为你的表达语言parser(你应该指定在纸上,包括它的形式语法例如使用BNF及其semantics)以及解析的ASTs的评估器。正式来说,你的M_PI看起来像一个数学变量,并在某些环境中有其价值。

如果您想要走这条路线,请阅读关于解释器和compiler实施的一些教程教科书。 recursive descent parser上的wikipage正在解释如何做类似于您的需求的事情。谷歌还对算术表达式求值器,你会得到很多相关的点击。

关于GNU bison(解析器生成器,有时称为compiler-compiler)的文档包含一个部分:§2.2 infix notation calculator,它与您的需求类似。

2

您需要阅读文件的内容并自行评估。 M_PI不是编程环境之外的数字,除非有人将其解释为除法,否则除法运算符/实际上只是一种斜线。所以,你需要创建一些评估器来提供文件的内容。

当您在您的C源代码中编写M_PI/2时,您会得到π/ 2,因为编译器知道M_PI在math.h中定义为π(真的近似π),并且它知道除法运算符。但是,您没有编写任何编译器或任何可以按您的方式评估的编译器或任何东西,因此只需在文件写入文件时获取文件的内容即可。

读取文件时获取所需内容的最简单方法是将所需的值(即1.5707963267949)存储在文件中。 fscanf()将读取该值并将其正确地解释为浮点数,因为这是您告诉它在您的格式字符串中读取的值。

+0

我打算使用1.5707963267949。但是,我想我会问社区是否有任何问题。 – 2014-10-03 16:49:12