Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

indent std::cout ?

Posted on 1998-12-06
4
Medium Priority
?
3,035 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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 100 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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Introduction This article is a continuation of the C/C++ Visual Studio Express debugger series. Part 1 provided a quick start guide in using the debugger. Part 2 focused on additional topics in breakpoints. As your assignments become a little more …
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

670 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