Solved

indent std::cout ?

Posted on 1998-12-06
4
2,896 Views
Last Modified: 2013-12-14
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!!!
0
Comment
Question by:MaDdUCK
  • 3
4 Comments
 

Expert Comment

by:nbell
ID: 1179398
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.
0
 

Accepted Solution

by:
DOMINIC011899 earned 50 total points
ID: 1179399
#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();
    }

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

0
 

Expert Comment

by:DOMINIC011899
ID: 1179400
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.

0
 

Expert Comment

by:DOMINIC011899
ID: 1179401
what's happening here, my comments and answers are not getting through!
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Here is a helpful source code for C++ Builder programmers that allows you to manage and manipulate HTML content from C++ code, while also handling HTML events like onclick, onmouseover, ... Some objects defined and used in this source include: …
How to install Selenium IDE and loops for quick automated testing. Get Selenium IDE from http://seleniumhq.org Go to that link and select download selenium in the right hand columnThat will then direct you to their download page.From that page s…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…

929 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now