Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
587 / 354 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
1

Удаление комментариев в файле

17.05.2009, 13:38. Просмотров 2097. Ответов 5
Метки нет (Все метки)


Подскажите как можно реализовать удаление комментариев в исходном файле программы на С\С++. Я так понимаю мне надо сначала найти комментарий. Т.е. ищу косую черту (/), а за ней звездочку (*) и все, что после это и до */ заганяю в массив символов. А что дальше? Или изначально неправильный подход. Объясните поподробней.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.05.2009, 13:38
Ответы с готовыми решениями:

Удаление комментариев в файле (файл - код програмы на с++ записанв блокноте)
Есть файл(.txt) в котором заисан код проги с комментариями . Как удалить с файла все комментарии ?

Удаление комментариев
Помогите реализовать простую программу: 1. Загружается файл 1.txt; 2. Находятся и удаляются все...

Удаление комментариев
Имеется задача по удалению комментариев из файла и есть решение но оно не отрабатывает...

Удаление комментариев
необходимо написать программу для удаления комментариев в коде из исходного файла с разрешением...

5
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
17.05.2009, 15:09 2
Алгоритм-то прост:
1. Найти две косых черты подряд ("//"). Если найдены, то:
- зафиксировать позицию,
- найти конец строки ("\r\n" или "\n", зависит от ОС),
- удалить все от зафиксированной позиции до конца строки.
2. Найти последовательность "/*". Если найдены, то:
- зафиксировать позицию,
- найти последовательность "*/",
- удалить все от зафиксированной позиции до этого места, включая эту последовательность.
3. Перейти к п.1.

Проверки на конец файла добавь сам. В файле не должно быть незавершенного комментария.
1
587 / 354 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
17.05.2009, 15:25  [ТС] 3
Я извеняюсь за вопрос, но как удалить всё, что я сочту за комментарии? Пишу на Си и мало опыта работы с файлами.
0
Evg
Эксперт CАвтор FAQ
21153 / 8169 / 628
Регистрация: 30.03.2009
Сообщений: 22,468
Записей в блоге: 30
19.05.2009, 13:25 4
В таких задачах не надо пытаться что-либо удалить. Нужно просто из читать из одного файла и писать в другой. При этом какие-то байты пропускать. Условно говоря

L:
читаем символ из in-файла
если конце файла, то выход
если символ не '/', то переписываем его в out-файл и goto L;
читаем символ
если не / и не *, то переписываем его в out-файл и goto L;
если символ '/', то считываем в цикле из in-файла до тех пор, пока не энтер или не конец строки, после чего goto L;
если символ * то считываем из in-файла до тех пор, пока не встретим */, после чего goto L;

Я расписал на пальцах, как это аккруатно засунуть в цикл - сам посмотришь
1
239 / 117 / 14
Регистрация: 15.10.2010
Сообщений: 395
21.10.2011, 20:15 5
В продолжении темы. По удалению комментариев получилась такая вот немаленькая конструкция, насчитывающая 9 состояний детерминированного и полностью определённого конечного автомата.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
typedef enum States {Normal, Slash, Constant, Backslash, Comment, Comment1, Star, Symb_const, Backslash2} States;
 
int main()
{
    FILE *fi, *fo;
    States State = Normal;
    int c;
    const char BS = '\\';
    const char SL = '/';
    const char APF = '\'';
    fi = fopen("LAB.cpp", "rb");
    if(!fi)
    {
           printf("Input file open error\n");
           return 1;
    }
    
    fo = fopen("outfile.cpp", "wb");
    if(!fo)
    {
           printf("Output file open error\n");
           return 1;
    }
    
    while ((c = fgetc(fi)) != EOF)
    {
          /*****************обработка нормального состояния***************/
          switch (State)
          {
                 case Normal:                           
                      if (c == '/')              
                         State = Slash;          /*Переход в состояние Слэш*/
                      else if (c == '"')
                      {
                           State = Constant;     /*Константа*/
                           fputc(c, fo);
                      }
                      else if (c == '\'')
                      {
                           State = Symb_const;
                           fputc(APF, fo);
                      }
                      else
                          fputc(c, fo);
                      break;
                 /**********************Обработка слэша***************************/
                 case Slash:                     
                      if (c == '*')              /*Тут три варианта*/
                         State = Comment;        /*Если '*' то комментарий C*/
                      else if (c == '/')         /*Если // то С++*/
                           State = Comment1; 
                      else                       /*Иначе норма*/
                      {
                          State = Normal;
                          fputc(SL, fo);          /*Возвразаем в поток слэш*/
                          fputc(c, fo);           /*И символ*/
                      }
                      break;
                  /******Обработка строковой константы*******/    
                 case Constant:                    
                      if (c == '"')          /*Если встретили " то константа кончилась*/
                      {
                         State = Normal;
                         fputc(c, fo); 
                      }
                      else if (c == '\\')
                           State = Backslash;
                      else
                          fputc(c, fo);
                      break;
                 /*Обработка комента вида /**/
                 case Comment:       
                      if(c == '*')          /*тут ожидаем только завершения коммента*/
                           State = Star;     /*на выход ничего не даём*/
                      break;
                 case Comment1:      //обработка коммента С++
                      if ((c == '\n') || (c == '\r'))
                      {
                         State = Normal;
                         fputc(c, fo);
                      }
                      break;
                 /************************/
                 case Star:
                      if (c == '/')
                         State = Normal;
                      else if (c == '*')//на случай если звездочек в комменте много
                           State = Star;
                      else
                          State = Comment;
                      break;
                 /*Бэкслэш, встретившийся в строковой константе*/
                 case Backslash:
                      State = Constant;
                      fputc(BS, fo);
                      fputc(c, fo);
                      break;
                 //********** Символьная константа**********
                 case Symb_const:
                      if (c == '\'')
                      {
                         State = Normal;
                         fputc(APF, fo);
                      }
                      else if (c == '\\')
                           State = Backslash2;
                      else
                          fputc(c, fo);
                      break;
                 /*Бэкслэш, встретившийся в символьной константе*/
                 case Backslash2:
                      State = Symb_const;
                      fputc(BS, fo);
                      fputc(c, fo);
                      break;
          }
    }
    printf("End of clean");
    fclose(fi);
    fclose(fo);
    getch();
    return 0;
}
В качестве входного файла я использовал текст этой же программы, а выходной файл компилировал и запускал. Только вот всё как то громоздко получилось, может это можно реализовать проще? Просто программа с каждым шагом отладки нарастала как снежный ком, приходилось учитывать дополнительные состояния. И посмотрите, может еще какие нюансы не учтены?
0
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
22.10.2011, 11:09 6
Пример парсинга комментариев
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2011, 11:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Удаление комментариев
Всем привет ) Нужна Ваша помощь! Дан код на паскале в мемо, нужно при нажатии удалить коментарии с...

Удаление комментариев
Здравствуйте! Пишу программу для удаления комментариев из программ. Вот кусочек кода. Проблема...

Удаление комментариев из текста
вот написал прогу, которая убирает комментарий из текста в стиле /*... */ но есть 1 но, если в 1...

Удаление комментариев в коде
Добрый вечер! Может кто знает как быстро из кода VBA удалить все комментарии, а то у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.