Форум программистов, компьютерный форум CyberForum.ru

Программа удаляющая все комментарии из листинга программы С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
federe
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
05.10.2011, 14:54     Программа удаляющая все комментарии из листинга программы С++ #1
Помогите пожалуйста написать программу,удаляющую все комментарии из листинга программы С++.Программа должна обрабатывать файл *.cpp указываемый пользователем в начале работы.
обьяснения каждой строки желательно бы еще...Заплачу если надо..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
05.10.2011, 18:14     Программа удаляющая все комментарии из листинга программы С++ #2
federe, вот написал freeware версию, как вариант используй, если ошибки будут выбрось в топку.
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
#include <fstream>
#include <iostream>
using namespace std;
string comment_erase(string str);
 
int main(){
   char filename[255];
   char outname[255];
   strcpy(filename, "D:\\sample.cpp"); // имя открываемого файла
   strcpy(outname,  "D:\\no_comment.cpp"); // имя выходного файла
 
   // открываем файл любой из (.cpp, .h, .c, .hpp)
   fstream fp(filename, fstream::in);
   if(! fp.is_open())
        return 1;
   long    size;
   string  str;
   fp.seekg(0L, ios::end);  // перемещаем ф-указатель в конец файла
   size = fp.tellg();    // получаем кол-во байт файла
   fp.seekg(0L, ios::beg);  // устанавливаем ф-указатель в начало
   if(! size) {  // если файл не имеет байтов закрываем прогу
        fp.close();
        return 2;
   }
   char* buf = new char[size];  // выделяем буфер под все байты из файла
   if(buf == NULL) { //ошибка кучи или не хватка ОЗУ
        fp.close();
        return 3;
   }
   fp.read(buf, size); // читаем весь файл в буфер
   fp.clear();
   fp.close();
 
   buf[size - 1] = '\0';
   str.assign(buf);   // передаём буфер объекту string для последующего анализа текста
   delete[] buf;  // очищаем кучу
   buf = NULL;
 
   str = comment_erase(str); // удаляем комментария
 
   fp.open(outname, fstream::out); // создаём другой файл(вдруг что-то важное в оригинале удалим)
   if(! fp.is_open())
       return 4;
   fp.write(str.c_str(), str.length());// записываем в выходной файл
   fp.flush();
   fp.clear();
   fp.close();
   return 0;
}
 
string comment_erase(string str) {
   int  id;
   string::iterator tmp, last;
   for(string::iterator  iter = str.begin(); iter != str.end(); *iter++) {
          if( *iter == '"') // в строках никогда комментария не ищем
               for(iter += 1; *iter != '"' && iter != str.end(); *iter++);
        
          if(*iter == '/') {  // встречается обратная черта, а вдруг это не деление а началo многострчного комментария
                if(*(iter + 1) == '/') { // и так это однострочный комментарий
                      for(last = iter + 1; *last != '\n' && last != str.end(); *last++);
                      tmp = iter - 1;
                      str.erase(iter, last);  // удаляем диапaзон между N = last - iter
                      iter = tmp;
                } else if( *(iter + 1) == '*') { // а может быть это многострочный комментарий
                     id = 0;
                     for(last = iter + 1; last + 1 != str.end(); *last++) {
                           if( *last == '*' && *(last + 1) == '/') {  // ищем конец многострочнго комментария
                                 id = 1;
                                 last += 2;
                                 break;    // если конец найден прерываем цикл для удаления
                            }
                     }
                     if(id) { 
                          // сохраним позицию итератора чтобы не бегать всё заново по тексту
                         tmp = iter - 1; 
                         str.erase(iter, last);  // тоже самое удаление диапазона комментария
                         iter = tmp;  // продолжаем работу в поиске комментарий
                     }
                }
        }
    }
    return str;
}
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
05.10.2011, 22:01     Программа удаляющая все комментарии из листинга программы С++ #3
Ограничения freeware версии:
C++
1
'//not a comment'
C++
1
"blah blah blah\"string continued"
C++
1
2
// blah blah blah\
comment continued
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.10.2011, 06:34     Программа удаляющая все комментарии из листинга программы С++ #4
Удалить комментарии из файла. Помогите найти ошибку.
federe
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
08.10.2011, 22:02  [ТС]     Программа удаляющая все комментарии из листинга программы С++ #5
можете обьяснить что как происходит в этой проге? у меня эта курсовая,а я не очень понимаю..
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.10.2011, 12:17     Программа удаляющая все комментарии из листинга программы С++ #6
есть множество состояний, для каждого состояния есть свой набор действий, в том числе и по переходу в другие состояния
wiki. конечный автомат
wiki. конечный автомат. примеры
Yandex
Объявления
09.10.2011, 12:17     Программа удаляющая все комментарии из листинга программы С++
Ответ Создать тему

Метки
конечный автомат
Опции темы

Текущее время: 21:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru