2015-06-03 49 views
-1

我試圖編寫一個程序,模仿預處理程序的功能C預處理程序。 所以我的問題是關於擴大#include "header.h"陳述。編寫一個簡單的C預處理程序

我有一個FILE *指向源文件,所以我需要掃描所有的頭文件包含在源文件中,併爲每一個,進入相應的頭文件,並複製它的內容到一個新的文件,比將原始源文件複製到新文件,這將導致擴展的頭文件程序。

我的問題:通過掃描源文件達到實際的頭文件(這只是我寫的頭,所以他們應該在源文件所在的文件夾中查找)。

任何想法,將不勝感激。 (我沒有發佈我的悲慘嘗試,但如果它會幫助某種方式,我會發布它們)。

+1

是的,請把你的嘗試,因爲這將顯示你的準確卡住了。 – anatolyg

+0

當你有一個FILE指針時,如何讀取一行文本,就像fopen()返回的資源一樣。我也會推薦一本關於C的書;比照http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list與一些免費的。 –

+0

它是這樣的:分析問題。設計解決方案。 **閱讀您的工具**的文檔。實施解決方案測試。 – PJTraill

回答

2
  • 您從源文件打開輸出文件

  • fgets一行一行。

  • 您檢查每一行是否以#include開頭。如果否,則將讀取的行復制到輸出中。如果是,請打開名稱跟在#include之後的文件,並將其內容複製到輸出中。

  • 重複直到輸入結束。

以下是你的預處理器(我沒有測試過它;它應該工作):

#define FALSE 0 
#define TRUE 1 
#define MAX_LINE 1024 

char linebuf[MAX_LINE]; 
FILE *fpout; 

int preprocessor(FILE *fpin); 

int main(int argc, char **argv) 
{ 
    FILE *fpin; 
    if ((fpout=fopen(argv[2],"w"))==NULL) return(1); 
    if ((fpin= fopen(argv[1],"r"))==NULL) return(1); 
    preprocessor(fpin); 
    fclose(fpin); 
    fclose(fpout); 
    return(0); 
} 
int preprocessor(FILE *fpin) 
{ 
    FILE *fpin2; 
    while (fgets(linebuf,MAX_LINE,fpin)) 
    { 
     if (strncmp(linebuf,"#include",8)==0) { 
      char *cp1, *cp2; 
      if ((cp1= strchr(linebuf+9,'"'))==NULL) {fclose(fpin); return(FALSE);} 
      if ((cp2= strchr(cp1+1, '"'))==NULL) {fclose(fpin); return(FALSE);} 
      *cp2='\0'; 
      if ((fpin2=fopen(cp1,"r"))==NULL) { 
       printf("File '%s' not found.\n",cp1); 
       return(FALSE); 
      } 
      if (!preprocessor(fpin2)) {fclose(fpin2); return(FALSE);} 
      fclose(fpin2); 
     } 
     else fputs(linebuf, fpout); 
    } 
    return(TRUE); 
} 
+0

從包含文件複製的行應該經受相同的處理;包括嵌套。 –

+0

感謝您的回答。如何打開源文件,以便我可以讀取它。我只知道使用fopen的文件名,而我只有FILE *指針。 – Ahdriam

+1

@Ahdriam:如果你不得不問,你的這個項目的其餘部分很可能超出了你目前的技能。也許你應該從容易一點開始。 – usr2564301