2013-09-30 11 views
-2

Я хочу заменить каждый cout происходит в программе с таким же, но сцепляются с endl. Я пытаюсь использовать макросы для этого, но не могу понять, как это сделать. Пожалуйста помоги!Заменить COUT << «строка» с соиЬ << «строка» << епсИ в CPP

Есть ли способ получить полную строку, написанную в программе, и просто concat << endl с ней? Заметьте, если endl уже написан программистом, то endl будет конкатенироваться.

Если какой-либо другой метод лучше, пожалуйста, предложите.

+3

Просто прикрепляется перевод строки '\ n' струн вы выводите, то есть вместо' соиЬ << "бэ", '' написать COUT << «л \ п «;'.В большинстве случаев новая строка достаточно, и вам не нужно явно скрывать буфер. Использование макросов просто для сохранения нескольких символов - это плохая идея здесь и вернется, чтобы укусить вас позже. – us2012

+0

Является ли первый cout в вопросе, который должен быть капитализирован? Также это одноразовое исправление, или оно должно работать с каждой сборкой. –

+0

Я хочу, чтобы это не явным образом писать endl снова и снова, препроцессор cpp должен сделать это для меня. –

ответ

2

К сожалению, это возможно. Но я ни в коем случае не могу его потворствовать.

#include <iostream> 

namespace std 
{ 
class not_actually_cout{}; 

template<typename T> 
not_actually_cout& operator<< (not_actually_cout& stream, const T & v) 
{ 
    std::cout << v << std::endl; 
    return stream; 
} 

not_actually_cout not_actually_cout_instance; 
} 

#define cout not_actually_cout_instance 

int main(void) 
{ 
    cout << "why god why"; 
    cout << "please no"; 
    return 0; 
} 

Выходов:

why god why 
please no 
+4

Ха-ха. В то же время он заслуживает поддержки и понижения. –

+0

именно то, что я хотел ... спасибо !! –

+2

Это так неправильно. И умный, и кошмарный. – syam

0

Попробуйте использовать регулярные выражения. Все современные языки поддерживают их.

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

+0

Спасибо, сэр, но есть ли встроенная поддержка, я не хочу использовать стороннюю библиотеку. –

+2

Он не предлагает вам сделать это во время выполнения, просто используйте редактор, чтобы изменить текст. Каждая основная IDE имеет поддержку RegEx для замены текста. –

+0

@SamCristall Я думаю, вы приняли меня неправильно, я хочу, чтобы код должен измениться на cout << blah << endl; когда я скомпилирую свой код. Это динамично, и я не хочу, чтобы программист писал endl endl после каждого cout. –

9

Просто сделайте шаблон функции:

template<typename T> 
void printLn(T const & v, std::ostream & os = std::cout) 
{ 
    os << v << std::endl; 
} 

Если вы хотите получить фантазии с ним и дать несколько аргументов, и C++ 11 доступна для вас:

void printLn(std::ostream & os) 
{ 
    os << std::endl; 
} 

template<typename T, typename... Args> 
void printLn(std::ostream & os, T const & v, Args&&... args) 
{ 
    os << v; 
    printLn(os, std::forward<Args>(args)...); 
} 
+0

Я не понимаю, как это помогает с * Я хочу заменить 'std :: cout <<" blah ";' с 'std :: cout <<" blah "<< std :: endl;' * OP будет все еще нужно найти все экземпляры и заменить их на 'printLn (...)' – Praetorian

+0

@Praetorian: Я основываю свой ответ на этом комментарии: * «Я хочу, чтобы это не явным образом пишут endl снова и снова» * Идея состоит в том, чтобы избавиться от скуки добавления '<< std :: endl', когда вы хотите закончить строку. Я также сомневаюсь, что OP * действительно * будет доволен тем, что он запрашивает, и я интерпретировал его как проблему XY. –

+0

ОК, я совершенно неправильно понял вопрос. Я прочитал его как * У меня есть все эти инструкции 'cout', что я должен добавить новую строку и флеш, как мне это сделать? * – Praetorian

1

Что вы на самом деле увлекающийся? Новая строка после каждой операции вывода или флеш? Обратите внимание, что флеш действительно дорог.

Самый простой способ иметь флеш впрыскивается после каждой операции вывода является установка флагов std::ios_base::unitbuf (это значение по умолчанию для std::cerr):

std::cout << std::unitbuf; 

После этой операции вы получите флеш после каждая отдельная операция вывода, например

std::cout << "hello" << ' ' << "world\n"; 

вызовет три промывки. Чтобы автоматически также вставить новую строку, вы можете настроить буфер потока фильтрации, который добавляет новую строку (необязательно, если она не была) при промывке потока. Это будет означать перезапись и sync() функций std::streambuf и установку соответствующего буфера потока в std::cout в дополнение к настройке std::unitbuf. С этими изменениями не потребуется никакого изменения источника.

Приведенный ниже код демонстрирует соответствующую фильтрацию потока буфера:

#include <iostream> 
#include <streambuf> 

class newlinebuf 
    : public std::streambuf 
{ 
    enum { s_size = 64 }; 
    std::ostream& d_stream; 
    std::streambuf* d_sbuf; 
    char   d_buffer[s_size]; 
public: 
    newlinebuf(std::ostream& stream) 
     : d_stream(stream) 
     , d_sbuf(stream.rdbuf(this)) 
    { 
     this->setp(this->d_buffer, this->d_buffer + s_size - 1); 
    } 
    ~newlinebuf() { 
     if (this->d_stream.rdbuf() == this) { 
      this->d_stream.rdbuf(this->d_sbuf); 
     } 
    } 
    int overflow(int c) { // clear the buffer without flushing 
     std::streamsize size(this->pptr() - this->pbase()); 
     std::streamsize n(this->d_sbuf->sputn(this->pbase(), size)); 
     if (n == 0) { // no progress => error 
      return std::char_traits<char>::eof(); 
     } 
     std::copy(this->pbase() + n, this->pbase() + size, this->pbase()); 
     this->setp(this->d_buffer, this->d_buffer + s_size); 
     this->pbump(size - n); 
     if (c != std::char_traits<char>::eof()) { 
      *this->pptr() = std::char_traits<char>::to_char_type(c); 
      this->pbump(1); 
     } 
     return std::char_traits<char>::not_eof(c); 
    } 
    int sync() { 
     if (this->pptr() == this->pbase() || this->pptr()[-1] != '\n') { 
      *this->pptr() = '\n'; 
      this->pbump(1); 
     } 
     return this->overflow(std::char_traits<char>::eof()) 
      == std::char_traits<char>::eof()? -1: 0; 
    } 
}; 

int main() 
{ 
    newlinebuf sbuf(std::cout << std::unitbuf); 

    std::cout << "hello" << "_" << "world\n" << "next line"; 
} 

Основываясь на комментарий, я понимаю, что это, вероятно, не то, что вы хотите, но я не знаю портативной техники, которая просто использует препроцессор и/или компилятор для добавления новых строк.

+0

Я просто хочу, чтобы строка возвращалась также компилятором или препроцессором. –

Смежные вопросы