Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Тиммик
0 / 0 / 0
Регистрация: 29.06.2016
Сообщений: 2
1

Удаление всех комментариев из листинга программы на С++. В чем ошибка?

29.06.2016, 22:42. Просмотров 292. Ответов 2
Метки нет (Все метки)

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

Вот сам код:
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
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
#include <conio.h>
#include <locale>
#include <cmath>
#include <string>
 
using namespace std;
string comment_erase(string str);
 
int main()
{
char filename[255];
char outname[255];
strcpy_s(filename, "C:\\Users\\Эля\\Documents\\Vis ual Studio 2012\\Projects\\ConsoleApplication1 \\ConsoleApplication1\\sample.cpp") ; // имя открываемого файла
strcpy_s(outname, "C:\\Users\\Эля\\Documents\\Vis ual Studio 2012\\Projects\\ConsoleApplication1 \\ConsoleApplication1\\no_comment.c pp"); // имя выходного файла
// открываем файл любой из (.cpp, .h, .c, .hpp)
fstream file(filename, fstream::in);
if(! file.is_open())
return 1;
long size;
string str;
file.seekg(0L, ios::end); // перемещаем ф-указатель в конец файла
size=file.filesize(); // получаем кол-во байт файла
file.seekg(0L, ios::beg); // устанавливаем ф-указатель в начало
if (! size) { // если файл не имеет байтов закрываем прогу
file.close();
return 2;
}
char* buf = new char[size]; // выделяем буфер под все байты из файла
if(buf == NULL) { //ошибка кучи или не хватка ОЗУ
file.close();
return 3;
}
file.read(buf, size); // читаем весь файл в буфер
file.clear();
file.close();
buf[size - 1] = '\0';
str.assign(buf); // передаём буфер объекту string для последующего анализа текста
delete[] buf; // очищаем кучу
buf = NULL;
str = comment_erase(str); // удаляем комментария
file.open(outname, fstream:: out); // создаём другой файл(вдруг что-то важное в оригинале удалим)
if(! file.is_open())
return 4;
file.write(str.c_str(), str.length());// записываем в выходной файл
file.flush();
file.clear();
file.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;
}
0
Миниатюры
Удаление всех комментариев из листинга программы на С++. В чем ошибка?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2016, 22:42
Ответы с готовыми решениями:

Удаление комментариев из листинга программы
Создать программу, которая будет удалять из листинга программы на языке с++...

Удаление комментариев из текста программы с использованием STL, ошибка при выполнении
Здравствуйте решал задачу с использованием STL из книги Страуструпа 6.22...

Удаление из текста программы комментариев с использованием списков
Здравствуйте, уважаемые программисты! Я в С++ только недавно, в...

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

В чем ошибка? При запуске программы открывается консоль и сразу ошибка о завершении программы
К тому же выдает warning: deprecated conversion from string constant to 'char*'...

2
Геомеханик
792 / 597 / 939
Регистрация: 26.06.2015
Сообщений: 1,409
01.07.2016, 13:31 2
Тиммик, вот написал как вариант.
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
#include <iostream>
#include <fstream>
void _ignore(char*& s, char*& p, char c);
long _remcomm(char* s);
bool remove_comments(const char* _output, const char* _input);
 
int main(void){
    char _input[]  = "input.cpp";
    char _output[] = "output.cpp";
 
    if(! remove_comments(_output, _input))
        std::cout << "error remcomm!" << std::endl;
    return 0;
}
 
//удаление комментариев c/c++
bool remove_comments(const char* _output, const char* _input){
    long n, m;
    std::ifstream fin(_input, std::ifstream::binary);
    if(! fin.is_open())
        return false;
 
    fin.seekg(0, fin.end);
    if((n = fin.tellg()) <= 0)
        return false;
 
    char* s = new (std::nothrow) char[n + 1];
    if(s == NULL)
        return false;
 
    fin.seekg(0, fin.beg);
    fin.read(s, n);
    m = fin.gcount();
    fin.close();
 
    if(m != n){
        delete[] s;
        return false;
    }
    s[n] = '\0';
    m    = _remcomm(s);
 
    std::ofstream fout(_output, std::ofstream::binary);
    if(fout.is_open()){
        fout.write(s, m);
        fout.flush();
        fout.close();
    }
    delete[] s;
    return true;
}
 
//удаление комментариев
long _remcomm(char* s){
    char* i, *t = s;
    for(char* p = s; *s; *s = *p){
        if((*p == '"') || (*p == '\''))
            _ignore(s, p, *p);
        else if((*p == '/') && (*(p + 1) == '/')){ //удаляем однострочные комментария
            i = p + 2;
            while(*i && (*i != '\r') && (*i != '\n'))
                ++i;
            p = i;
        } else if((*p == '/') && (*(p + 1) == '*')){ //удаляем многострочные комментарии
            i = p + 2;
            while(*i){
                if((*i == '*') && (*(i + 1) == '/')){
                    i += 2;
                    break;
                }
                ++i;
            }
            p = i;
        } else
            ++s, ++p;
    }
    return (long)(s - t);
}
 
//пропуск
void _ignore(char*& s, char*& p, char c){
    char* i = p + 1;
    while(*i && (*i != c)){
        if(*i == '\\')
            ++i;
        ++i;
    }
    if(*i == c)
        ++i;
    
    while(p != i)
        *s++ = *p++;
}
0
Тиммик
0 / 0 / 0
Регистрация: 29.06.2016
Сообщений: 2
01.07.2016, 18:44  [ТС] 3
Большое спасибо, попробую, как что отпишусь
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2016, 18:44

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

Программа удаляющая все комментарии из листинга программы С++
Помогите пожалуйста написать программу,удаляющую все комментарии из листинга...

Удаление элемента списка, не могу понять в чем ошибка
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; #include...


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

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

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