Link to home
Start Free TrialLog in
Avatar of MaDdUCK
MaDdUCK

asked on

indent std::cout ?

is there a way to produce indented text with std::cout? I want to be able to do something like this:

std::cout << "text (normal indentation).\n";
std::cout << indent(4) << "text indented by 4 spaces\nwhich also wraps lines.\n";
std::cout << "normal text again.\n";

to yield:

text (normal indentation).
    text indented by 4 spaces
    which also wraps lines.
normal text again.

I know this is easy if I specifically state '\n', but can I indent text which virtually wraps after, say 80 characters (but not in the middle of a word)?
is this possible in C++ with STL libraries? if not, how would I implement this. If someone helps me with the implementaion, I will raise points!!!
Avatar of nbell
nbell

Since you are using string literals perhaps the following code would work for you:

#include <iostream.h>
#include <iomanip.h>

const char *indent(int x) {
      char *p=new char[x];
      for (int i=0;i<x;i++){
            p[i]=*(" ");
      }
      p[x]=NULL;
      return p;
}

int main(int argc, char* argv[])
{
cout << setw(80)<<setiosflags(ios::left)<<"text (normal indentation)."
     << indent(4)<< setw(76)<<setiosflags(ios::left)<<"text indented by 4 spaces"
     << indent(4)<< setw(76)<<setiosflags(ios::left)<<"which also wraps lines.";
cout << "normal text again.\n";
      return 0;
}



I am not sure that indent(int) is already available anywhere.  That code is rather ugly though.

Perhaps a more elegant solution is to use your own string package in which the stream insertion operator << is overloaded to do the "wrapping" you desire.
ASKER CERTIFIED SOLUTION
Avatar of DOMINIC011899
DOMINIC011899

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
I posted my answer (which is a C++ code) but a different thing came up in the answer box.  Whatever is in that answer box is not from me.  Below is my answer:

#include <IOSTREAM>
#include <IOMANIP>
#include <STRING>
#include <STRSTREAM>
using namespace std;


template <class TP0, class TP1, class TP2>
class OMANIP_INDENTWRAP
    {
    TP0 m_var0;
    TP1 m_var1;
    TP2 m_var2;
    typedef ostream &(*PFN)( ostream &, TP0, TP1, TP2 );
    PFN m_pfn;

    public:
    OMANIP_INDENTWRAP( PFN pfunc, TP0 data0, TP1 data1, TP2 data2  )
        : m_pfn( pfunc ), m_var0( data0 ), m_var1( data1 ), m_var2( data2 )
        {}

    friend ostream &operator<<(
        ostream &os, OMANIP_INDENTWRAP<TP0, TP1, TP2> &robj )
        {
        return (*robj.m_pfn)( os, robj.m_var0, robj.m_var1, robj.m_var2 );
        }
    };

ostream &FuncIndentWrap( ostream &os, const char *szText,
    int nIndent, int nWidthMax )
    {
    istrstream isText( szText );
    char szLineBuf[80] = "";
    int nWidthAccum = 0;

    for ( int n=0;  n<nIndent;  n++ )
        os << ' ';                  

    while ( isText.getline( szLineBuf, sizeof( szLineBuf ), ' ' ) )
        {
        nWidthAccum += strlen( szLineBuf ) + 1;

        if    ( nWidthAccum > nWidthMax )
            {
            os << endl;
            for ( int n=0;  n<nIndent;  n++ )
                os << ' ';
            nWidthAccum = strlen( szLineBuf ) + 1;
            }

        os << szLineBuf << ' ';
        }

    return os;
    }


OMANIP_INDENTWRAP<const char *, int, int> IndentWrap(
    const char *szText, int nIndent, int nWidthMax )
    {
    return OMANIP_INDENTWRAP<const char *, int, int>(
        FuncIndentWrap, szText, nIndent, nWidthMax );
    }


void main()
    {
    char szText[80] = "This will indent the text 4 spaces and wrap after 15 chars.";
    cout << IndentWrap( szText, 4, 15 ) << endl;
    cin.get();
    }


// This is the actual result
    This will
    indent the
    text 4 spaces
    and wrap after
    15 chars.

what's happening here, my comments and answers are not getting through!