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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
federe
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
#1

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

05.10.2011, 14:54. Просмотров 2690. Ответов 5

Помогите пожалуйста написать программу,удаляющую все комментарии из листинга программы С++.Программа должна обрабатывать файл *.cpp указываемый пользователем в начале работы.
обьяснения каждой строки желательно бы еще...Заплачу если надо..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2011, 14:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа удаляющая все комментарии из листинга программы С++ (C++):

Программа удаляющая комментарии из листинга программы С++ - C++
помогите пожайлуста , никак не могу разобраться. Создать програму, какая будет удалять с кода програмы языка С++ (файл *.cpp) коментарии...

Программа удаляющая программы - C++
Привет всем! Хочу написать программу удаляющую другие программы (как Add or Remove Programs в Windows). Какими функциями пользоваться?...

Программа,удаляющая все чётные цифры из строки - C++
Программа,удаляющая все чётные цифры из строки

программа, удаляющая из заданного текста все части, заключенные в скобки - C++
Написать программу удаляющую из заданного текста все части, заключенные в круглые скобки, вместе со скобками.

Удаление комментариев из листинга программы - C++
Создать программу, которая будет удалять из листинга программы на языке с++ (файл*.cpp) коментарии вида // коментарий. Для работы с...

Сохранить листинг программы в файл, удалив из него все комментарии - C++
Создать файл и записать в него текст любой программы, удалить из файла все комментарии. Проблема в том, что создавать файл нужно через...

5
xAtom
915 / 740 / 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;
}
1
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 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
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.10.2011, 06:34 #4
Удалить комментарии из файла. Помогите найти ошибку.
0
federe
0 / 0 / 0
Регистрация: 05.10.2011
Сообщений: 5
08.10.2011, 22:02  [ТС] #5
можете обьяснить что как происходит в этой проге? у меня эта курсовая,а я не очень понимаю..
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.10.2011, 12:17 #6
есть множество состояний, для каждого состояния есть свой набор действий, в том числе и по переходу в другие состояния
wiki. конечный автомат
wiki. конечный автомат. примеры
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2011, 12:17
Привет! Вот еще темы с ответами:

Удаление всех комментариев из листинга программы на С++. В чем ошибка? - C++
Выходит ошибка, файл во вложении. Помогите разобраться, пишу программу по программированию, задание курсовой работы: Создать программу...

Программа, удаляющая лишние пробелы - C++
На просторах форума столкнулся с программой по удалению лишних пробелов, объясните пожалуйста работу некоторых строк #include...

Функция, удаляющая все элементы в списке - C++
Как ее реализовать? Прошу помощи

Написать комментарии в коде программы (C++) - C++
Помогите, пожалуйста, правильно прокомментировать код программы: #pragma once // Описание виртуального класса &quot;деталь&quot; #include...


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

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
09.10.2011, 12:17
Ответ Создать тему
Опции темы

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