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

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

Войти
Регистрация
Восстановить пароль
 
Тиммик
0 / 0 / 0
Регистрация: 29.06.2016
Сообщений: 2
#1

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

29.06.2016, 22:42. Просмотров 256. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Удаление всех комментариев из листинга программы на С++. В чем ошибка? (C++):

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

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

Удаление из текста программы комментариев с использованием списков - C++
Здравствуйте, уважаемые программисты! Я в С++ только недавно, в программировании совсем ничего еще не смыслю, поэтому обращаюсь к Вам за...

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

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

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

2
Геомеханик
773 / 579 / 402
Регистрация: 26.06.2015
Сообщений: 1,378
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
Привет! Вот еще темы с ответами:

Удаление элемента списка, не могу понять в чем ошибка - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; #include &lt;time.h&gt; #include &lt;iomanip&gt; using namespace std; struct...

В чем ошибка программы? - C++
konstruktor.setmatr(); konstruktor.printmatr(); Вот на этих командах выдает ошибку!??? //oop-class #include &lt;windows.h&gt; ...

Решение: Удаление комментариев // и /* */ - C++
может кому пригодится#include &lt;cwchar&gt; #include &lt;ostream&gt; #include &lt;istream&gt; #include &lt;iostream&gt; namespace nocomment { ...

Удаление комментариев из файла - C++
Решил написать программу которая удаляет комментарии из файла и пишет текст в другой файл, но она вдруг запинается на некоторых...


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

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

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