2014-10-03 136 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