Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.06.2016, 22:25   #1
Тиммик
Новичок
Джуниор
 
Регистрация: 29.06.2016
Сообщений: 1
Восклицание Помогите пожалуйста с листингом

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

Вот сам код:

Код:
#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\\Visual Studio 2012\\Projects\\ConsoleApplication1\\ConsoleApplication1\\sample.cpp"); // имя открываемого файла
   strcpy_s(outname, "C:\\Users\\Эля\\Documents\\Visual Studio 2012\\Projects\\ConsoleApplication1\\ConsoleApplication1\\no_comment.cpp"); // имя выходного файла
// открываем файл любой из (.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;
}
Изображения
Тип файла: jpg 1.jpg (25.9 Кб, 138 просмотров)

Последний раз редактировалось Аватар; 30.06.2016 в 21:55.
Тиммик вне форума Ответить с цитированием
Старый 30.06.2016, 21:23   #2
SAMOUCHKA
Форумчанин
 
Регистрация: 07.08.2011
Сообщений: 576
По умолчанию

код читать очень сложно, пока разберешь глаза сломаешь.
SAMOUCHKA вне форума Ответить с цитированием
Старый 30.06.2016, 21:48   #3
ur_naz
Заблокирован
 
Регистрация: 17.06.2016
Сообщений: 62
По умолчанию

Выход за границу строки, где-то с индексами символов накосячили в циклах
ur_naz вне форума Ответить с цитированием
Старый 30.06.2016, 22:23   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
 for(iter += 1; *iter != '"' && iter != str.end(); *iter++)
Нельзя так. Сначала проверка на конец и только потом разыменование итератора.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите создать програму для роботы с файлами, пожалуйста помогите нужно очень срочно Сергей Человек Фриланс 3 06.07.2009 19:30
Помогите Помогите Пожалуйста Решить Одну Задачку в Паскале!!! VisTBacK Помощь студентам 6 19.09.2008 13:44