服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++学习之IO流(输入输出流)详解

C++学习之IO流(输入输出流)详解

2022-07-11 08:55考拉爱睡觉鸭~ C/C++

流是一种抽象概念,它代表了数据的无结构化传递。而用来进行输入输出操作的流就称为IO流。这篇文章主要为大家介绍了C++中IO流的使用详解,需要的朋友可以参考一下

介绍

流: 若干字节数据从一端到另一端我们叫做流

例如:操作文件,从程序到文件,数据的流动的操作称为流操作

流类体系

专门处理输入输出流、字符流、文件流,包含有:

  • 流对象
  • 流运算符 >>  <<

输入/出流对象 + 流运算符 >>  <<---处理输入输出的数据

字符流对象 + 流运算符 >>   <<   ---处理字符流

文件的对象 + 流运算符 >>  <<    ---读写文件

基本输入、输出流

istream 类---cin       输入

ostream类---cout     输出

tip:输出流除了cout外,还有一些别的对象(效果和cout一样)

  • cerr ---标准出错
  • clog ---日志文件输出
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
void testostream()     //output
{
    //freopen()
    cout << "标准输出" << endl;     //cin/cout都可以重定向
    cerr << "标准错误输出" << endl;   //不能重定向 当觉得程序可能出错时用cerr输出,标识作用
    clog << "日志文件输出" << endl;  //可以重定向为文件
}
int main(){
 
    testostream();
}
/*输出*/
 
/*标准输出
 标准错误输出
 日志文件输出*/

freopen

把程序的输入、输出重定向为文件

重定向是文件中的数据的格式要与程序读取的格式一致

输入重定向

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<cstdio>
#include<iostream>
int main(){
 
    freopen("1.txt","r",stdin);//参数:文件名 读写方式 流
    int a,b;
    scanf("%d%d",&a,&b);       //把基本输入定向为文件,程序所有的输入由文件完成
    std::cout<<a+b;
 
}
/*输出*/
 
/* 在黑窗口输出3 */

输出重定向

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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 */

字符类的处理

  • 正常的操作
  • 通过IO流对象调用成员函数的方式

单个字符和字符串的输出处理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//调用成员函数的方式传常量、变量都可以
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*/

单个字符和字符串的输入处理

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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

?
1
2
string text;
cin.getline(text,20);    //报错,不能处理string,只能处理char*

格式控制字符

包含头文件 <iomanip>

常用的格式控制,一种是调用成员函数方式,一种流控制字符去做

  • 设置有效位数: setprecision(n)
  • 设置精度: fixed 结合 setprecision 使用

tip:流控制字符---c++用来控制格式的操作

设置格式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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    */

进制输出

?
1
2
3
4
5
6
7
8
9
10
11
12
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位制表

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//默认右对齐
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流内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_60569662/article/details/121785539

延伸 · 阅读

精彩推荐
  • C/C++c++中const的使用详解

    c++中const的使用详解

    本篇文章是对c++中的const的应用进行了详细的分析介绍,需要的朋友参考下 ...

    C++教程网2032020-11-27
  • C/C++C++中的几种排序算法

    C++中的几种排序算法

    这篇文章主要介绍了C++中的几种排序算法,需要的朋友可以参考下...

    C++教程网11702021-01-15
  • C/C++C语言实现括号匹配的方法

    C语言实现括号匹配的方法

    这篇文章主要介绍了C语言实现括号匹配的方法,文中代码简单易懂,方便大家更好的学习,感兴趣的朋友可以参考下...

    孟应杰8402021-09-09
  • C/C++使用c++调用windows打印api进行打印的示例代码

    使用c++调用windows打印api进行打印的示例代码

    这篇文章主要介绍了使用c++调用windows打印api进行打印的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    子物11792021-09-13
  • C/C++浅析五种C语言内存分配的方法及区别

    浅析五种C语言内存分配的方法及区别

    在C语言中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。...

    C语言与C++编程11982022-01-07
  • C/C++Qt QChart 创建图表的实现方法

    Qt QChart 创建图表的实现方法

    这篇文章主要介绍了Qt QChart 创建图表的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    咸鱼Doyoung4152021-10-15
  • C/C++C语言转义字符详解

    C语言转义字符详解

    这篇文章主要介绍了C语言转义字符详解,本篇文章通过简要的案例,讲解了C语言转义字符该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    大话硬件11352021-12-01
  • C/C++Unix下C程序内存泄漏检测工具Valgrind的安装与使用详解

    Unix下C程序内存泄漏检测工具Valgrind的安装与使用详解

    以下是对Unix下C程序内存泄漏检测工具Valgrind的安装与使用进行了详细的分析介绍,需要的朋友可以过来参考下...

    C语言教程网2602020-12-21