枞阳做网站,网络科技有限公司取名,没有网站怎么做百度优化,中英文网站建设大概多少钱在C中#xff0c;标准输出流通常指的是与标准输出设备#xff08;通常是终端或控制台#xff09;相关联的流对象。这个流对象在C标准库中被定义为std::cout、std::err、std::clog#xff0c;它们是std::ostream类的一个实例。
一、cout#xff0c;cerr和clog流 ostream类… 在C中标准输出流通常指的是与标准输出设备通常是终端或控制台相关联的流对象。这个流对象在C标准库中被定义为std::cout、std::err、std::clog它们是std::ostream类的一个实例。
一、coutcerr和clog流 ostream类定义了3个输出流对象即coutcerrclog。
1.1cout流对象 (1) cout是console output的缩写意为控制台终端显示器的输出。它不是C预定义的关键字而是ostream流类的对象在iostream中定义。顾名思义流是流动的数据cout流是流向输出显示设备的数据cout流中的数据是用流插入运算符““顺序加入的。 示例如下
cout Hello World! I am learning C.; cout流是容纳数据的载体而并不是运算符。cout将它们输送到输出设备上显示在显示设备上输出”Hello Wordl! I am learning C.“。 (2) 在使用cout 输出基本类型的数据时不必考虑数据是什么类型系统会自动判断数据的类型并根据类型选择调用与之匹配的运算符重载函数。示例如下
cout 10.0f 100.58 operator; (3) cout流在内存中对应开辟了一个缓冲区用来存储流中的数据当向cout流插入一个endl时不论缓冲区是否已满都立即输出流中所有数据然后插入一个换行符并刷新流清空缓冲区。示例如下
cout Hello World endl;
cout I am learning C endl; 注意的是如果插入换行符”\n“则只是换行而已并不是刷新cout流与endl刷新流是清空缓冲区不是一回事。 (4) 在iostream中只对”“和运算符用于标准类型数据的输入输出进行了重载但未对用户声明的类型数据的输入输出进行重载。所以用户可以声明新的类型并用”“和运算符对其进行输入输出另作重载。
1.2 cerr流对象 cerr流对象是标准出错流cerr流已被指定为与显示器关联cerr作用是向标准出错设备standard error device输出有关的出错信息。cerr是console error的缩写意为在控制台显示器显示出错的信息。 注意的是cerr和cout的作用和用法虽然差不多但是有一点不同的是cout流通常是传送到显示设备输出也可以被重定向输出到磁盘文件而cerr流中的信息只能显示输出。 通过解一元二次方程其一般解为但若a0或时用公式出错。编写程序从键盘输入a、b、c的值求和。如果a0或输出错误信息。代码示例如下
#include iostream
#include cmath
using namespace std;int main(){float a, b, c, disc;cout Please enter the values of a, b, c:;cin a b c;// 如果a等于0输出错误信息if(a 0){cerr a is equal to zero, error! endl;} else{// 如果b * b - 4 * a * c)结果小于0 输出错误信息if( (disc b * b - 4 * a * c) 0 ){cerr Erro: distb*b-4*a*c0 endl;} // 满足条件则正常输出结果else{cout x1 (-b sqrt(disc) / (2*a)) endl;cout x2 (-b - sqrt(disc) / (2*a)) endl;}}return 0;
}
1如输入a0运行后结果如下图 2如输入运行后结果如下图 3如满足条件运行后结果如下图 1.3 clog流对象 clog流对象也是标准出错流它是console log的缩写作用与cerr相同都是在终端显示器上显示出错信息。它们之间只是有微小区别。cerr是不经过缓冲区直接向显示器上输出有关信息而clog中的信息存放在缓冲区中缓冲区满后或遇endl时向显示器输出。 示例如下
#include iostream
using namespace std;int main(){clog This is a message to the C librarys error stream. endl;clog.flush(); //确保消息被立即刷新到设备return 0;
} 运行结果如上图 实际编程中cerr通常用于输出需要立即显示的错误消息或调试信息而clog用于记录那些稍后再处理的更详细的日志信息。这只是常见的约定并不是强制的。 二、格式输出 在输出数据时为简便起见往往不指定输出的格式由系统根据数据的类型采取默认的格式但有时希望数据按指定的格式输出如要求以十六进制或八进制形式输出一个整数对输出的小数只保留两位小数等。
2.1 使用控制符控制输出格式 以下为输出数据的控制符如下表
控制符作用dec 设置整数的基数为10 hex设置整数的基数为16oct设置整数的基数为8setbae(n)设置整数的基数为n(n只能是81016三者之一)setfill(c)设置填充字符cc可以是字符常量或字符变量setprecision(n)设置实数的精度为n位在以一般十进制小数形式输出时n代表有效数字。在以fixed固定小数位数形式和scientific指数形式输出时n为小数位数。setw(n)设置字段宽度为n位setiosflags(ios::fixed)设置浮点数以固定的小数位数显示setiosflags(ios::scientific)设置浮点数以科技记数法即指数形式显示setiosflags(ios::left)输出数据左对齐setiosflags(ios::right)输出数据右对齐setiosflags(ios::skipws)忽略前导的空格setiosflags(ios::uppercase)在以科学记数法输出E和以十六进制输出字母X时以大写表示setiosflags(ios::showpos)输出正数时给出”“号resetioflags()终止已设置的输出格式状态在括号中应指定内容 注意的是这些控制符是在头文件iomanip中定义的因而程序中应当包含头文件ipmanip。以下通过案例了解以上的方法代码如下
#include iostream
#include iomanip
using namespace std;int main(){int a 20; //定义整数a值为20// 输出信息cout Dec: dec a endl; //以十进制形式输出整数cout Hex: hex a endl; //以十六进制形式输出整数acout Oct: oct a endl; //以八进制形式输出整数acout endl;// 通过setbase输出cout Use setbase to set the base: endl;cout Dec: setbase(10) a endl; //以十进制形式输出整数cout Hex: setbase(16) a endl; //以十六进制形式输出整数acout Oct: setbase(18) a endl; //以八进制形式输出整数acout endl;// 设置精度宽度以及填充字符double PI 3.1415926;cout set precision 2: setprecision(2) PI endl; //改为2位小数cout setw(10) setprecision(2) PI endl; //设置宽度为10cout setfill(*) setw(10) setprecision(2) PI endl; //设置填充字符cout endl;// setiosfloagscout setiosflags(ios::scientific) setprecision(8); // 按指数形式输出8位小数cout PI PI endl; // 指数形式输出PI值cout precision 4 PI setprecision(4) PI endl; // 指数形式 输出PI为4位小数cout Left aligned, PI left setw(20) PI endl; // 左侧齐cout Right aligned, PI right setw(20) PI endl; // 右对齐 // 使用大写字母cout Uppercase: uppercase hex 255 endl; //以16进制显示并使用大写字母cout Show positive sign: showpos PI endl;// 注意此时cout Fixed, PI setiosflags(ios::fixed) PI endl; // 改为小数形式输出return 0;
} 运行结果如下图 最后代码试图将科学记数法设置为小数位但是cout Fixed, PI setiosflags(ios::fixed) PI endl;输出结果为0XC.90FDA6896C25P-2它可能是由于被setiosflags错误的解析导致的通过resetiosflags重置清理掉前面的科学记数法格式即可。在上述代码后面追加以下代码即可
// 重置指数形式
cout reset ios flags: endl;
cout resetiosflags(ios::scientific | ios::showpos);
cout PI PI endl; resetiosflags中ios::scientific是清除科学记数法ios::showpos是清除数值前面”“号输出结果如下图 2.2 用流对象的成员函数控制输出格式 除了可以用控制符来控制输出格式还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数如下表
流成员函数与之作用相同的控制符作用precision(n)setprecision(n)设置实数的精度为n位width(n)setw(n)设置字段宽度为n位fill(c)setfill(c)设置填充字符csetf()setiosflags()设置输出格式状态括号中应给出格式状态内容与控制符setiosflags括号中的内容相同。unsetf()resetiosflag()终止已设置的输出格式状态在括号中应该指定内容 格式标志在类ios中被定义为枚举值因此在引用这些格式标志时要在前面加上类名ios和域运算符::。格式标志如下表
格式标志作用ios::left输出数据在本域范围内向左对齐ios::right输出数据在本域范围内向右对齐ios::internal数值的符号位在域宽度内左对齐数值右对齐中间由填充字符填充ios::dec设置整数的基数为10ios::oct设置整数的基数为8ios::hex设置整数的基数为16ios::showbase强制输出整数的基数八进制数以0打头十六进制数以0x打头ios::showpoint强制输出浮点数的小点和尾数0ios::uppercase在以科学记数法格式E和以十六进制输出字母时以大写表示ios::showpos对正数显示”“号ios::scientific浮点数以科学记数法格式输出ios::fixed浮点数以定点格式小数形式输出ios::unitbuf每次输出之后刷新所有的流ios::stdio每次输出之后清除stdout, stderr 下面使用流控制成员输出之前案例数据代码如下
#include iostream
#include iomanip
using namespace std;int main(){int a 20; //定义整数a值为20// 输出信息cout.setf(ios::dec); //设置以十进制形式输出整数cout Dec: a endl;cout.unsetf(ios::dec); cout.setf(ios::hex); //设置以十六进制形式输出整数acout Hex: a endl; cout.unsetf(ios::hex);cout.setf(ios::oct); //设置以八进制形式输出整数acout Oct: a endl; cout.unsetf(ios::oct);cout endl;// 设置精度宽度以及填充字符double PI 3.1415926;cout set precision 2, PI PI endl; //显示PI值cout.width(30); //设置宽度为30cout set width, PI PI endl; cout.width(30); //设置宽度为30cout.fill(*); // 置填充字符*cout set fill, PI PI endl;cout endl;cout set internal: endl;cout.width(30); //设置宽度为30cout.fill( ); // 置填充字符*cout.setf(ios::internal | ios::showpos);cout PI endl;cout.unsetf(ios::internal | ios::showpos);cout endl;// 标记为科学记数法cout.setf(ios::scientific); // 设置为科学记数法cout set scientific, PI PI endl;cout.precision(4); //保留4位小数cout precision 4, PI PI endl;cout endl;// 指定用定点形式输出cout.setf(ios::fixed);cout Fixed, PI PI endl;cout.unsetf(ios::fixed);return 0;
} 运行后结果如下图 这里同样在最后输出时PI未得到想要结果这是因为在设置科学记数法格式cout.setf(ios::scientific未及时清除设置的格式标志导致的所以添加cout.unsetf(ios::scientific及时清除以避免影响后续输出。 完整代码如下
#include iostream
#include iomanip
using namespace std;int main(){int a 20; //定义整数a值为20// 输出信息cout.setf(ios::dec); //设置以十进制形式输出整数cout Dec: a endl;cout.unsetf(ios::dec); cout.setf(ios::hex); //设置以十六进制形式输出整数acout Hex: a endl; cout.unsetf(ios::hex);cout.setf(ios::oct); //设置以八进制形式输出整数acout Oct: a endl; cout.unsetf(ios::oct);cout endl;// 设置精度宽度以及填充字符double PI 3.1415926;cout set precision 2, PI PI endl; //显示PI值cout.width(30); //设置宽度为30cout set width, PI PI endl; cout.width(30); //设置宽度为30cout.fill(*); // 置填充字符*cout set fill, PI PI endl;cout endl;cout set internal: endl;cout.width(30); //设置宽度为30cout.fill( ); // 置填充字符*cout.setf(ios::internal | ios::showpos);cout PI endl;cout.unsetf(ios::internal | ios::showpos);cout endl;// 标记为科学记数法cout.setf(ios::scientific); // 设置为科学记数法cout set scientific, PI PI endl;cout.precision(4); //保留4位小数cout precision 4, PI PI endl;cout.unsetf(ios::scientific);cout endl;// 指定用定点形式输出cout.setf(ios::fixed);cout Fixed, PI PI endl;cout.unsetf(ios::fixed);return 0;
} 输出结果如下图 三、用流成员函数put输出字符 在程序中一般用cout和插入运算符”“实现输出cout流在内存中有相应的缓冲区。有时有些特殊输出要求ostream类还提供了专用于输出单个字符的成员函数put。
3.1 ASCII码输出 如下示例代码
#include iostream
using namespace std;int main(){// ASCII字符码输出int arr[] {71, 79, 79, 68}; // 字母GOOD分别对应ASCII码71,79,68// 循环输出单个字符for(int i 0; i4; i) cout.put(arr[i]);cout.put(\n);return 0;
} 运行结果如下图 3.2 字符串反转 也可使用cout.put()对字符串进行反转输出示例代码如下
#include iostream
#include string
using namespace std;int main(){string message Hello World!; //定义字符串信息const char *str message.c_str(); //将字符串转换为char字符数组// 循环输出字符信息倒序输出for(int i message.length() - 1; i 0; i--) cout.put(*(str i));// 换行cout.put(\n);return 0;
} 运行后结果如下图 字符指针变量str指向第1个字符H a1则是第2个字符e的地址*(a1)的值就是’e。指针的相关知识前面已讲解过想了解朋友可以翻看下地址C面向对象程序设计 - 对象指针和this指针_面向对象版本的指针-CSDN博客
3.3 putchar函数 除了可以用cout.put函数输出一个字符外还可以用putchar函数输出一个字符。putchar函数是C语言中使用的在stdio.h头文件中定义的。所以3.2中示例可以修改为putchar函数代码如下
#include iostream
#include string
using namespace std;int main(){string message Hello World!; //定义字符串信息const char *str message.c_str(); //将字符串转换为char字符数组// 循环输出字符信息倒序输出for(int i message.length() - 1; i 0; i--) putchar(*(str i));// 换行cout.put(\n);return 0;
} 运行后输出结果与3.2相同。