【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>> 流提取运算符

④ 关闭文件


相关文章
|
2月前
|
测试技术 C++ iOS开发
c++IO库详细介绍
前言 简单分享一下c++ IO相关的一些知识点,希望对大家有用
48 0
|
3月前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
56 0
|
安全 C语言 C++
【C++】—— C++的IO流
【C++】—— C++的IO流
|
8月前
|
编译器 C语言 C++
C++ --- 特殊类 --- 类型转换 ---IO流
C++ --- 特殊类 --- 类型转换 ---IO流
48 0
|
4月前
C++IO流文件读写(文本文件,二进制文件)
C++IO流文件读写(文本文件,二进制文件)
40 0
|
4月前
|
算法 C语言 C++
C++的IO流
C++的IO流
25 0
|
5月前
|
安全 C语言 C++
|
5月前
|
编译器 C++
C++入门(1):命名空间,IO流 输入输出,缺省参数
C++入门(1):命名空间,IO流 输入输出,缺省参数
|
5月前
|
人工智能 物联网 编译器
【C++初阶(一)】学习前言 命名空间与IO流
【C++初阶(一)】学习前言 命名空间与IO流
49 0
|
5月前
|
存储 网络协议 Linux
解密异步IO:使用C++进行高效的网络编程
解密异步IO:使用C++进行高效的网络编程