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!!!
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!!!
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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.
#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!
#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:
<< indent(4)<< setw(76)<<setiosflags(ios:
<< indent(4)<< setw(76)<<setiosflags(ios:
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.