我一直在尝试将输出格式化为控制台的时间最长,并且没有发生任何事情.我一直在尝试尽可能多地使用iomanip和ofstream&out函数.
void list::displayByName(ostream& out) const
{
node *current_node = headByName;
// I have these outside the loop so I don't write it every time.
out << "Name\t\t" << "\tLocation" << "\tRating " << "Acre" << endl;
out << "----\t\t" << "\t--------" << "\t------ " << "----" << endl;
while (current_node)
{
out << current_node->item.getName() // Equivalent tabs don't work?
<< current_node->item.getLocation()
<< current_node->item.getAcres()
<< current_node->item.getRating()
<< endl;
current_node = current_node->nextByName;
}
// The equivalent tabs do not work because I am writing names,
// each of different length to the console. That explains why they
// are not all evenly spaced apart.
}
Run Code Online (Sandbox Code Playgroud)
他们可以使用什么来使它们彼此正确对齐?我正在调用的函数是不言自明的,并且所有长度都不同,因此彼此之间不能很好地对齐.
我已经尝试了所有的东西iomanip.
Ara*_*raK 17
可以把它想象成使用Microsoft Excel :)您可以将您的流视为字段.因此,首先设置字段的宽度,然后在该字段中插入文本.例如:
#include <iostream>
#include <iomanip>
#include <string>
int main()
{
using namespace std;
string firstName = "firstName",
secondName = "SecondName",
n = "Just stupid Text";
size_t fieldWidth = n.size(); // length of longest text
cout << setw(fieldWidth) << left << firstName << endl // left padding
<< setw(fieldWidth) << left << secondName << endl
<< setw(fieldWidth) << left << n << endl;
cout << setw(fieldWidth) << right << firstName << endl // right padding
<< setw(fieldWidth) << right << secondName << endl
<< setw(fieldWidth) << right << n << endl;
}
Run Code Online (Sandbox Code Playgroud)
......

......
场宽只意味着宽度text + spaces.fill除了空格之外你还可以:
string name = "My first name";
cout << setfill('_') << setw(name.size() + 10) << left << name;
Run Code Online (Sandbox Code Playgroud)
.....
output::
My first name__________
Run Code Online (Sandbox Code Playgroud)
......
我认为最好的方法是找出你的格式然后,编写一个新的格式化程序来完成你想要的所有工作:
#include <iostream>
#include <iomanip>
#include <string>
std::ostream& field(std::ostream& o)
{
// usually the console is 80-character wide.
// divide the line into four fields.
return o << std::setw(20) << std::right;
}
int main()
{
using namespace std;
string firstName = "firstName",
secondName = "SecondName",
n = "Just stupid Text";
size_t fieldWidth = n.size();
cout << field << firstName << endl
<< field << secondName << endl
<< field << n << endl;
}
Run Code Online (Sandbox Code Playgroud)
如果你开始考虑参数化操纵器,只有那个接受一个int或long参数很容易实现,如果你不熟悉其他类型,其他类型真的很模糊C++.
Boost有一个格式库,允许您像旧的C printf()一样轻松地格式化输出,但是C++的类型安全.
请记住,旧的C printf()允许您指定字段宽度.如果输出尺寸过小,则此空间填充该字段(请注意,它不能处理超大字段).
#include <iostream>
#include <iomanip>
#include <boost/format.hpp>
struct X
{ // this structure reverse engineered from
// example provided by 'Mikael Jansson' in order to make this a running example
char* name;
double mean;
int sample_count;
};
int main()
{
X stats[] = {{"Plop",5.6,2}};
// nonsense output, just to exemplify
// stdio version
fprintf(stderr, "at %p/%s: mean value %.3f of %4d samples\n",
stats, stats->name, stats->mean, stats->sample_count);
// iostream
std::cerr << "at " << (void*)stats << "/" << stats->name
<< ": mean value " << std::fixed << std::setprecision(3) << stats->mean
<< " of " << std::setw(4) << std::setfill(' ') << stats->sample_count
<< " samples\n";
// iostream with boost::format
std::cerr << boost::format("at %p/%s: mean value %.3f of %4d samples\n")
% stats % stats->name % stats->mean % stats->sample_count;
}
Run Code Online (Sandbox Code Playgroud)
您可以编写一个始终将相同数量的字符打印到标准输出的过程。
就像是:
string StringPadding(string original, size_t charCount)
{
original.resize(charCount, ' ');
return original;
}
Run Code Online (Sandbox Code Playgroud)
然后在你的程序中这样使用:
void list::displayByName(ostream& out) const
{
node *current_node = headByName;
out << StringPadding("Name", 30)
<< StringPadding("Location", 10)
<< StringPadding("Rating", 10)
<< StringPadding("Acre", 10) << endl;
out << StringPadding("----", 30)
<< StringPadding("--------", 10)
<< StringPadding("------", 10)
<< StringPadding("----", 10) << endl;
while ( current_node)
{
out << StringPadding(current_node->item.getName(), 30)
<< StringPadding(current_node->item.getLocation(), 10)
<< StringPadding(current_node->item.getRating(), 10)
<< StringPadding(current_node->item.getAcres(), 10)
<< endl;
current_node = current_node->nextByName;
}
}
Run Code Online (Sandbox Code Playgroud)