Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Считывание со стандартного потока ввода

52K
23 октября 2012 года
Gevorg
22 / / 10.04.2011
Доброго времени суток . Столкнулся вот с такой проблемой . Есть функция , которая считывает со стандартного потока ввода код программы на С++ и удаляет там все комментарии . Собственно , функция работает , но это не то , что я хочу . Я хочу записывать корректной код уже без комментариев в какую-то string - строку , а затем вывести ее на экран , но проблема вот в чем : в функции использую цикл
 
Код:
while (cin.get(c)) {....}
, который фактически не дает завершить функцию , ибо считывает текст вечно . Можно , конечно , по ходу дела правильные символы сразу выводить на экран , но тогда при вставке текста в консоль происходит дублирование строк (под каждой строкой ее вариант без комментариев) , что не очень красиво смотрится . Возможно , вопрос дурацкий , но можно ли как-то ограничить считывание ?

Код:
#include <iostream>
#include <string>
 
using std::cin;
using std::cout;
using std::string;
 
void deleteComments() {
    //string buffer = "";
    bool slash = false;
    char c, q;
    while (cin.get(c)) {
        if (c == '/') {
            if (slash) {
                slash = false;
                while (cin.get(c) && c != '\n');
                cout << '\n';
                //buffer += '\n';
            } else {
                slash = true;
            }
        } else if (c == '"' || c == '\'') {
            slash = false;
            cout << (q = c);
            //buffer += (q = c);
            while (cin.get(c)) {
                cout << c;
                //buffer += c;
                if (c == q) {
                    break;
                }
                if (c == '\\') {
                    cout << cin.get();
                    //buffer += cin.get();
                }
            }
        } else {
            if (slash) {
                if (c == '*') {
                    slash = false;
                    while (cin.get(c) && (!slash || c != '/')) {
                        slash = (c == '*');
                    }
                } else {
                    cout << '/' << c;;
                    //buffer += '/';
                    //buffer += c;
                }
            } else {
                cout << c;
                //buffer += c;
            }
            slash = false;
        }
    }
    //cout << "\nSource code without comments :\n" << buffer << endl;      
}
 
int main() {
    deleteComments();
    //system("pause");
    return 0;
}
9.7K
06 ноября 2012 года
Vitamant
228 / / 07.02.2011
Именно по этой причине 98% программ никогда не считывает текст непрерывным потоком. В конце концов, юзверь может ошибиться! Поэтому, ему предоставляют возможность записать свои данные, после чего предлагают нажать Enter. После этого считываются не отдельные символы, а вся строка целиком. И уже она, при известной длине (или в ожиданрии терминирующего 0 или ещё каких-либо разделителей) обрабатывается в программе и бесконечных циклов там не предполагается.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог