2015-06-03 4 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

@ Ахдриам: если вы должны спросить об этом, весь остальной часть этого вашего проекта, скорее всего, будет за пределами ваших текущих навыков. Возможно, вам стоит начать с чего-то немного легче. – usr2564301

Смежные вопросы