Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 29.06.2016
Сообщений: 2

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

29.06.2016, 22:42. Показов 3069. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2016, 22:42
Ответы с готовыми решениями:

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

Кракозяблы на месте русских комментариев при копировании листинга программы
Как исправить?

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

2
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
01.07.2016, 13:31
Тиммик, вот написал как вариант.
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  [ТС]
Большое спасибо, попробую, как что отпишусь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2016, 18:44
Помогаю со студенческими работами здесь

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

Удаление всех комментариев в исходнике python кода
Файл input.txt содержит корректный Python код. Написать программу, которая удаляет все комментарии из исходного файла и сохраняет его в...

Удаление комментариев в тексте программы .cs
Здравствуйте. Помогите, пожалуйста, подправить код. Когда ввожу '/*' и через несколько символов '/*', то текст должен остаться без...

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru