【C++】-- IO流(一)

简介: 【C++】-- IO流

一、C语言输入输出

C语言中使用最频繁的输入输出是scanf和printf:

       scanf(): 从标准输入设备(键盘)读取数 据,并将值存放在变量中。

       printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。

C语言借助缓冲区进行输入输出:

输入输出缓冲区的作用:

(1) 可以屏蔽低级IO的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。

(2)可以使这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以 定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。

二、流

1.什么是流

“流”是流动的意思,是物质从一处向另一处流动的过程,也是对一种有序连续且具有方向性的数据(可用bit,byte,packet做单位)的抽象描述。

2.C++ IO流

C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存) 输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。

它的特性是:有序连续、具有方向性。

为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用来供C++实现IO。

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类

(1)C++标准IO流

C++标准库提供了4个全局流对象cin、cout、cerr、clog:

cout:进行标准输出,即数据从内存流向控制台(显示器)。

cin:进行标准输入即数据通过键盘输入到程序中。

cerr:用来进行标准错误的输出。

clog:进行日志的输出。

从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。在使用时候必须要包含文件并引入std标准命名空间:

1. #include<iostream>
2. using namespace std;
3. 
4. int main()
5. {
6.  cout << "正常输出到屏幕" << endl;
7.  cerr << "错误输出到屏幕" << endl;
8.  clog<< "日志输出到屏幕" << endl;
9. 
10.   return 0;
11. }

注意:

①  cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据。

②   输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。

③   空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入。

1. #define  _CRT_SECURE_NO_WARNINGS  1
2. #include<iostream>
3. #include<string>
4. using namespace std;
5. 
6. struct Book
7. {
8.  int _id = 1;
9.  string _name = "STL源码剖析";
10. };
11. 
12. int main()
13. {
14.   Book b;
15.   cin >> b._id >> b._name;
16.   cout << "书号:" << b._id << " 书名:" << b._name << endl;
17. 
18.   return 0;
19. }

输入书名时如果中间带空格,那么打印书名时,只能拿到空格之前的文字,因为有空格会在两个缓冲区里面,会被存到两个字符串里面,而打印时只取走了第一段:

如果想拿到完整的带空格的字符串,用getline去获取一整行:

1. int main()
2. {
3.  string s;
4.  getline(cin, s);
5.  cout << s << endl;
6. 
7.  return 0;
8. }

④   cin和cout可以直接输入和输出内置类型数据,原因:标准库已经将所有内置类型的输入和输出全部重载了:

⑤  对于自定义类型,如果要支持cin和cout的标准输入输出,需要对<<和>>进行重载。如自定义Date类,对其>> 和<<进行重载

1. #include<iostream>
2. using namespace std;
3. 
4. class Date
5. {
6. //友元函数
7. friend ostream& operator<<(ostream& out, const Date& d);
8. friend istream& operator>>(istream& in, Date& d);
9. 
10. public:
11.   //构造函数
12.   Date(int year = 2022, int month = 4, int day = 8)
13.   {
14.     _year = year;
15.     _month = month;
16.     _day = day;
17.   }
18. 
19. private:
20.   int _year;
21.   int _month;
22.   int _day;
23. };
24. 
25. ostream& operator<<(ostream& out,const Date& d)
26. {
27.   out << d._year << "-" << d._month << "-" << d._day << endl;
28. 
29.   return _cout;
30. }
31. 
32. istream& operator>>(istream& in, Date& d)
33. {
34.   in >> d._year;
35.   in >> d._month;
36.   in >> d._day;
37. 
38.   return in;
39. }
40. 
41. int main()
42. {
43.   Date d1;
44.   cin >> d1;
45.   cout << d1 <<endl;
46. 
47.   return 0;
48. }

⑥  OJ题中,有IO型OJ的算法,一般都需要循环输入:

a.单个元素循环输入:

1. // 单个元素循环输入
2. while(cin>>a)
3. {
4. // ...
5. }

b.多个元素循环输入:

1. // 多个元素循环输入
2. while(cin>>a>>b>>c)
3. {
4. // ...
5. }

c.多行循环输入

1. // 整行接收
2. while(cin>>str)
3. {
4. // ...
5. }
1. int main()
2. {
3.  string s;
4.  while (cin >> s)
5.  {
6.    cout << s << endl;
7.  }
8. 
9.  return 0;
10. }

如果用c语言持续接收多行输入:

1. int main()
2. {
3. char buffer[100];
4. while(scanf("%s",buff) != EOF)
5.     {
6. printf("%s\n");
7.     }
8. 
9. return 0;
10. }

(2)C++IO文件流的操作步骤

C++根据文件内容的数据格式分为二进制文件和文本文件。采用文件流对象操作文件一般步骤:

① 定义一个文件流对象,分为3种:

操作
ifstream 只写
ofstream 只读
fstream 读+写

② 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系

打开方式 说明
in 只读
out 可写
app 每次写之前定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO

③ 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写

操作 功能
read 从文件读取一个字节
write 向文件写入一个字节
get 从文件读取多个字节
put 向文件写入多个字节
seekg 设置要从输入流中提取的下一个字符的位置
seekp 设置下一个字符要插入到输出流中的位置
tellg 返回当前字符在输入流中的位置
tellp 返回当前字符在输出流中的位置
operator<< 流插入运算符
operator>> 流提取运算符

④ 关闭文件


相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
89 0
|
6月前
|
C语言 iOS开发 C++
10. C++IO流
10. C++IO流
40 0
|
6月前
|
测试技术 C++ iOS开发
c++IO库详细介绍
前言 简单分享一下c++ IO相关的一些知识点,希望对大家有用
86 0
|
6月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
116 0
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
73 1
Linux C/C++之IO多路复用(aio)
|
5月前
|
C++
C++的简单文本文件IO
C++的简单文本文件IO
|
1月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
23 0
Linux C/C++之IO多路复用(poll,epoll)
|
6月前
|
算法 C语言 C++
【C++】C++的IO流
【C++】C++的IO流
|
6月前
|
存储 算法 C语言
【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]
【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]
117 0
|
3月前
|
算法 C语言 C++
【C++航海王:追寻罗杰的编程之路】C++的IO流
【C++航海王:追寻罗杰的编程之路】C++的IO流
33 2