Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB
4 декабря 2018 г. 6:42

#define, редактирование текста

Qt, text

Приветствую. Учусь на первом курсе, и к сессии получил такое задание:
Необходимо сделать программу, которая открывает какие-либо .cpp файлы, ищет в них #define, в которых описаны некоторые константы (например k = 5), если находит, то далее программа проходится по всему коду, и заменяет встреченные константы k на число 5 (т.е. for (int i = 0; i < k; ++i) просто превратится в for (int i = 0; i < 5; ++i)). Собственно таким образом и работает сам #define, а мне необходимо повторить. Вот только проблема в том, что я совершенно не имею понятия, как это сделать. То есть, открыть файл и найти в нем эту константу я еще смогу, но каким образом потом заменять? Спасите

17

Как вариант читаешь построчно и меняешь, записываешь в файл

0

Добрый день!

Можно считать файл, весь или построчно, как предложили выше, использовть регулярку и заменить с помощью неё интересующие места в тексте. А потом записать всё в новый файл.

Например, так

#include <QFile>
#include <QRegularExpression>
#include <QRegularExpressionMatch>
#include <QRegularExpressionMatchIterator>
#include <QTextStream>

int main(int argc, char *argv[])
{
    QFile data("D:/check.cpp");
    data.open(QIODevice::Text | QIODevice::ReadOnly);
    QString dataText = data.readAll();

    QRegularExpression re("k");
    QString replacementText("5");

    dataText.replace(re, replacementText);

    QFile newData("D:/new_check.cpp");
    if(newData.open(QFile::WriteOnly | QFile::Truncate)) {
        QTextStream out(&newData);
        out << dataText;
    }
    newData.close();

    return 0;
}

Для Django рекомендую VDS-хостинг TIMEWEB

0

Доброго времени суток, Евгений! Думаю, что они на 1м курсе проходят visual studio. Наверняка код, написанный с помощью библиотек Qt ему не поможет. В ВУЗах,насколько мне известно, Qt изучают в разделе прикладного программирования.

0

Добрый день!

Я бы с вами согласился, но человек задал вопрос в разделе Qt, а помимо этого ещё и тег Qt добавил, если с разделом можно ошибиться, то думаю, что с тегом уже вряд ли. Так что мой ответ в данном контексте вполне уместен должен быть.

Для Django рекомендую VDS-хостинг TIMEWEB

0

Упс, прошу прощения, перепутал разделы и на тег не глянул..))

0

Ну, не знаю как у других, но у меня на первом курсе идет Qt, и вот такая вот ерунда

0

Эх, если бы все было так просто. Штука же не в том, чтобы просто заменить текст, а заменить именно ту константу и только её. А в вашей реализации заменяются вообще любые символы 'k' на 5. В том и заключается сложность, чтобы каким-то образом отделить обычные буквы 'k', например, в названии функции, от нашей константы
0

Я полагал, что всё будет гораздо сложнее, но это уже будет зависеть от вашей конкретной реализации, конкретного кода, который нужно обработать, и сложности регулярного выражения, которое будете использовать. Для парсинга нет универсального решения в принципе. А что касается дефайнов, то они хотя бы стандартизированы в рамках языка программирования, поэтому парсер линковщика с ними справляется, а что касается констант, то тут уж вам нужно будет продумывать отдельные случаи, или отталкиваться от синтаксиса и конструкций языка. По сути нужно написать синтаксический анализ, как в IDE. Увы, но здесь уложиться простым парсингом не выйдет, если только у вас нет ограниченного набора случаев, но просто константа k .... На простое задание в университете это не похоже, если нужно парсить константы, имя которых состоит из одной лишь буквы. Это курсовая?

Для Django рекомендую VDS-хостинг TIMEWEB

1

Если бы курсовая. Нет, просто дело в том, что мой преподаватель очень меня любит, потому, собственно, первая же моя сессия переменилась с обычных ответов на вопросы с билетов на вот это..
А что всё-таки по теме можете сказать? Есть идеи? Я постараюсь сегодня узнать, на сколько строги условия (возможно, константа всегда будет описана на какой-нибудь 6 строке, или типа того)

0

Если по теме, то по максимуму уточняйте информацию о задании. Честно, найти букву и заменить - это значит тыкаться в эту букву везде и проверять не является ли она частью имени атрибута, класса или ещё неизвестно чего.

Уточните важный момент. Из того кода, что вы привели, я вижу, что k и kkk объявлены в define, если нужно искать именно текстовые значения, которые объявлены в данных секциях, то задача сужается. Возможно, хватит анализа дефайнов и попытке нахождения совпадений.

Тогда задача будет состоять из нескольких шагов.

  1. Анализ дефайнов
  2. Постороения списка на замену
  3. Анализ cpp файла и замена - это самое сложное. Нужно будет проверять всё построчно и каким-то образом понять, что это именно подставленный дефайн, а не часть текста и т.д.

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



Для Django рекомендую VDS-хостинг TIMEWEB

0

Да, точно. вы уточняли про дефайны в вопросе, я не обратил внимания. Ну сути это не меняет. Обрисуйте шаги преподавателю, уточните, правильно ли вы поняли задание в соответсвии с шагами, которы я вам написал. Уточните, достаточно ли будет использовать для этого регулярные выражения.

Для Django рекомендую VDS-хостинг TIMEWEB

0

Главное, чтобы ваш преподаватель также не был пользователем этого сайта :D

А то влетит вам потом )) Как никак это практически единственный достаточно активный и живой русскоязычный ресурс по Qt

Для Django рекомендую VDS-хостинг TIMEWEB

2

Собственно, ничего нового он не сказал. Define могут находиться в любом месте, задание я понял правильно, из подсказок никаких нормальных не дал, только то, о чем я думал и сам - проверять, чтобы символы слева и справа входили в перечень допустимых (типа скобки, знаки равенства\неравенства, и все такое).

0

Ну смотрите, первый шаг - это считать дефайны.

Считать нужно будет построчно, сделать это можно так, если это файл.

QFile inputFile(fileName);
if (inputFile.open(QIODevice::ReadOnly))
{
   QTextStream in(&inputFile);
   while (!in.atEnd())
   {
      QString line = in.readLine();
      ...
   }
   inputFile.close();
}


Если это QTextEdit или QPlainTextEdt, то можно считать всё и разбить на строки

QString plainTextEditContents = ui->plainTextEdit->toPlainText()
QStringList lines = plainTextEditContents.split("\n");

Дальше регуляркой проходитесь по каждой строке и ищите там этот самый дефайн, выбираете его значение и сохраняете в какой-нибудь QVector<QString>, это будет пул дефайнов на замену.

А вторым шагом с помощью регулярок, как я изначально написал пробуете заменить всё в тексте с учётом допустимых символов. Попробуйте сами написать соответствующие регулярные выражения.


Для Django рекомендую VDS-хостинг TIMEWEB

0

Ну. Часть работы сделано. Меня почти похвалили. Главная проблема - что он не читает макросы. То есть, если будет запись вида #define max(x,y) (x>y)?x:y , то при встрече в коде участка типа max(a,2444), оно должно заменить (a>2444)?a:2444. А как - не понятно. Ну и еще я не могу сделать замену дефайна по строкам, то есть оно меняет сразу через весь текст, а если делать через QStringList - почему-то умирает

0

Имхо. надо искать исходник компилятора и брать код оттуда :-)

0

Но если серьезно, то действительно помощь нужна. Мне по-хорошему нужно сдать это в понедельник

0

Ответы

Только авторизованные пользователи могут отвечать на форуме.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
9 декабря 2018 г. 22:00
Yura Gajdar

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:70баллов,
  • Очки рейтинга1
9 декабря 2018 г. 2:33
anat_home@ukr.net

C++ - Тест 001. Первая программа и типы данных

  • Результат:100баллов,
  • Очки рейтинга10
9 декабря 2018 г. 2:29
anat_home@ukr.net

C++ - Тест 001. Первая программа и типы данных

  • Результат:60баллов,
  • Очки рейтинга-1
Последние комментарии
9 декабря 2018 г. 8:14
Евгений Легоцкой

Вы можете в QSettings записать откуда угодно bool переменную без всяких чекбоксов. def save_check_box_settings(self): settings = QSettings() settings.setValue(SETTINGS_TRAY,...
8 декабря 2018 г. 13:02
Жасулан Нургожинов

а как можно это сделать без чек бокса
5 декабря 2018 г. 13:25
Евгений Легоцкой

Значит всё-таки в переменных окружения была проблема. Полагаю, что Qt Creator берёт информацию сначала из переменных PATH, либо записывает её из  своего конфига, а потом берёт уже из PATH при ...
5 декабря 2018 г. 13:21
IscanderChe

В переменной PATH путь к CMake был указан как G:\soft\CMake\bin, в реальности же каталог называется Cmake. Причём после изменения в переменной PATH всё заработало, а в Qt Creator путь ос...
5 декабря 2018 г. 10:53
Евгений Легоцкой

Под linux как правило проще, там всё по свои каталогам и полочкам разложено сразу. Думается мне, что проблема все-таки где-то в путях переменных...
Сейчас обсуждают на форуме
9 декабря 2018 г. 18:55
Игорь Максимов

Доброго времени суток. Нашел приложение для конвертации видео + celery что очень радует. Не радует только то что оно отказывается работать под python3 Трейсбек прикладываю: File "/ho...
9 декабря 2018 г. 15:14
Евгений Легоцкой

Непонятно, вы драйвер скачали или собирали? Сдаётся мне, что возможно более правильный вариант собрать своим компилятором вначале его, а потом уже подключать.
8 декабря 2018 г. 18:30
Жасулан Нургожинов

может так будет понятнее# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'C:\Users\hallgato\PycharmProjects\workers.ui'## Created by: PyQt5 UI code generator 5.11...
8 декабря 2018 г. 10:51
Даниил Тетерин

Но если серьезно, то действительно помощь нужна. Мне по-хорошему нужно сдать это в понедельник
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы