介绍
流: 若干字节数据从一端到另一端我们叫做流
例如:操作文件,从程序到文件,数据的流动的操作称为流操作
流类体系
专门处理输入输出流、字符流、文件流,包含有:
输入/出流对象 + 流运算符 >>? <<---处理输入输出的数据
字符流对象 + 流运算符 >>? ?<<? ?---处理字符流
文件的对象 + 流运算符 >>? <<? ? ---读写文件
基本输入、输出流
istream 类---cin? ? ? ?输入
ostream类---cout? ? ?输出
tip:输出流除了cout外,还有一些别的对象(效果和cout一样)
- cerr ---标准出错
- clog ---日志文件输出
- #include <iostream>
- using namespace std;
- void testostream() //output
- {
- //freopen()
- cout << "标准输出" << endl; //cin/cout都可以重定向
- cerr << "标准错误输出" << endl; //不能重定向 当觉得程序可能出错时用cerr输出,标识作用
- clog << "日志文件输出" << endl; //可以重定向为文件
- }
- int main(){
-
- testostream();
- }
- /*输出*/
-
- /*标准输出
- 标准错误输出
- 日志文件输出*/
freopen
把程序的输入、输出重定向为文件
重定向是文件中的数据的格式要与程序读取的格式一致
输入重定向
- #include<cstdio>
- #include<iostream>
- int main(){
-
- freopen("1.txt","r",stdin);//参数:文件名 读写方式 流
- int a,b;
- scanf("%d%d",&a,&b); //把基本输入定向为文件,程序所有的输入由文件完成
- std::cout<<a+b;
-
- }
- /*输出*/
-
- /* 在黑窗口输出3 */
输出重定向
- #include<cstdio>
- #include<iostream>
- int main(){
-
- freopen("1.txt","r",stdin);//参数:文件名 读写方式 流
- int a,b;
- scanf("%d%d",&a,&b); //把基本输入定向为文件,程序所有的输入由文件完成
- std::cout<<a+b;
- freopen("2.text","w",stdout);
- printf("%d",a+b);
-
- }
- /*输出*/
-
- /* 在2.txt中输出3 */
字符类的处理
单个字符和字符串的输出处理
- //调用成员函数的方式传常量、变量都可以
- void testostream()
- {
- //单个字符的输出
- cout.put('a'); //传常量 通过IO流对象调用成员函数的方式
- cout << 'a' << endl; //正常的输出方式
-
- char c = 'C';
- cout.put(c); //传变量
- cout << c << endl;
- //多个字符/字符串的输出
- cout.write("ILoveyou",4); /*直接写入输出 后面的参数:指定长度,超过长度的部分不做输
- 出截取输出没有'\0',只截取了前面4位*/
- }
- int main(){
-
- testostream();
- }
- /*输出*/
-
- /*aa
- CC
- ILov*/
单个字符和字符串的输入处理
- void testostream()
- {
- //单个字符的输入
- /* char c;
- c=cin.get();
- cout.put(c); 用中间变量接收返回值,再做输出*/
- cout.put(cin.get()); //要处理回车
- cout << endl;
-
- //多个字符/字符串的输入
- cout << "字符串的处理"<<endl;
- while (cin.get() != '\n');
- //while(getchar()!='\n');
- char str[20] = ""; //准备一个字符串 注意不是返回值不能一步到位
- cin.getline(str, 20);//输入函数
- cout.write(str, 20); //输出函数 相对于流操作更安全,可以指定长度,同样需要清空缓冲区处理
- }
- int main() {
-
- testostream();
- }
- /*输出*/
-
- /*a
- a
- 字符串的处理
- hello
- hello*/
注意不能用来处理string
- string text;
- cin.getline(text,20); //报错,不能处理string,只能处理char*
格式控制字符
包含头文件 <iomanip>
常用的格式控制,一种是调用成员函数方式,一种流控制字符去做
- 设置有效位数: setprecision(n)
- 设置精度: fixed 结合 setprecision 使用
tip:流控制字符---c++用来控制格式的操作
设置格式
- int main(){
-
- double pi = 34.12343;
- cout << "设置有效位数是:" << setprecision(4) << pi << endl; //从整数位开始算
- cout << "有效小数位:" << fixed << setprecision(4) << pi << endl;//从小数位开始算
-
- //所有的流控制符都会对应一个成员函数的方式
- cout.precision(4);
- cout << "有效小数位:" << pi;/*设置完流格式不一定要立即输出,
- 可以缓慢输出(在下一行输出)*/
-
- double pi = 34.12369;
- cout << "设置有效位数是:" << setprecision(4) << pi << endl;
- cout << "有效小数位:" << fixed << setprecision(4) << pi << endl;
- cout.precision(4); //所有的流控制符都会对应一个成员函数的方式
- cout << "有效小数位:" << pi;
- }
- /*输出 四舍五入 */
-
- /* 设置有效位数是:34.12
- 有效小数位:34.1234
- 有效小数位:34.1234
- 设置有效位数是:34.12
- 有效小数位:34.1237
- 有效小数位:34.1237 */
进制输出
- int main(){
- cout << hex << 32 << endl; //16进制
- cout << oct << 15 << endl; //8进制输出
- //流控制字符的方式
- cout << setbase(2) << 7 << endl; //2进制无效,不能是任意进制,任意进制的默认10进制输出
-
- }
- /*输出*/
-
- /*20
- 17
- 7*/
对齐方式和数据的宽度问题? ? ? ? 制表符 '\t'
限制每个数据的位数不足补空格?
1. 8位制表,不足8位? 补空格? ? ? ?
2. 超过8位,按照16位制表?
- //默认右对齐
- int main(){
-
- cout << setw(8) << "123" << setw(8) << "12344" << setw(8) << "3444" << endl;
- cout << setiosflags(ios::left);//ios::right右对齐 ios::left左对齐 数据不够用空格占位
- cout << setw(8) << "123" << setw(8) << "12344" << setw(8) << "3444" << endl;
- /*cout.width(8);
- cout<<"123"<<"123"<<"666"; 调用成员函数的方式,只能管一个制表
-
- }
- /*输出*/
- 123 12344 3444 //默认是右对齐方式
- 123 12344 3444
-
- 123 123666
到此这篇关于C++学习之IO流(输入输出流)详解的文章就介绍到这了,更多相关C++ IO流内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!