【C++】IO学习笔记
一、面向控制台的输入/输出
1、基于函数库的控制台I/O
输出:
//输出字符ch,函数返回输出的字符或者EOF(操作失败) int putchar(int ch); //输出char*型字符串,函数返回一个非负整数或者EOF(操作失败) int puts(const char*p); //对基本类型数据进行输出,函数返回输出的字符个数或者返回负数(操作失败) int printf(const char *format [, <参数表>]);
输入:
//从键盘输入一个字符,返回输入的字符或返回EOF(操作失败) int getchar(); //从键盘输入一个字符串放入p所指的内存空间,成功时返回p,否则返回NULL char *gets(char *p); //对基本类型的数据进行输入,返回实际输入的数据个数或返回EOF(操作失败) int scanf(const char *format [, <参数表>]);
2、基于类库的控制台I/O (#include <iostream>)
输入:
cin (istream类对象)
setw(int n) //指定输入字符的最大个数
例:cin.getline(str,10); //输入带空格的字符串
输出:
cout,cerr,clog (ostream类的对象)
cout对应计算机系统的标准输入设备;cerr和clog对应用于输出程序错误信息的设备
cerr和clog不受输出重定向的影响
endl //输出换行符,执行flush dec //十进制输出(月份前三个字母) oct //八进制 hex //十六进制 setprecision(int n) //设置符点数的精度
还有ostream类提供的一些字节流成员,如put,write函数,write函数再后文中输出二进制数据时有用到。
3、抽取/插入操作符“>>”和"<<"的重载
重载举例:
class A { int x,y; public: friend ostream& operator << (ostream& out, const A &a); } ostream& operator << (ostream& out, const A &a) { out<<a.x<<','<<a.y; return out; }
对于A类的派生类B,如果没有针对类B重载插入操作符"<<",则B类对象的输出按A类进行
对于以下问题
A *p; //p可能指向A类对象,也可能指向B类对象 cout<<*p; //不管p指向什么对象,都调用A类的重载函数
解决上述问题的方法就是再类A中定义一个虚函数display,派生类中进行重定义,可以实现动态绑定。
二、(⭐)面向文件的输入/输出
文件概述:在文件中,数据的存储方式有两种—>文本方式和二进制方式
两种方式的主要区别是:文本文件中只包含可显示字符和有限的几个控制字符;而二进制文件中可以包含任意的没有显示含式的二进制字节
(注:以二进制方式组织的文件不利于文件在不同的计算机平台上使用)
1、基于函数库的文件I/O
因为笔者对这部分操作使用不太习惯,所以暂时跳过,以后有时间再补上吧。
2、基于类库的文件I/O
包含的头文件; #include <iostream>; #include <fstream>
输出:
ofstream out_file; out_file.open(<文件名>, <打开方式>); //打开方式:ios::out 写操作 //ios::app 后续添加 //ios::binary 二进制文件打开 if(!out_file) exit(-1) //out_file << x << y <<endl; 以文本方式输出 out_file.write((char *)&x,sizeof(x)); //以二进制方式输出 out_file.close();
输入:
ifstream in_file(<文件名>, ios::in|ios::binary); //以二进制文件读入 if(!in_file) exit(-1); in_file.read((char *) &x,sizeof(x)); //以二进制方式输入数据 in_file.close();
三、面向字符串的输入/输出
基于字符串变量的输入/输出功能的库函数主要是sscanf 和 sprintf
这里的输入源和输出目标是内存中的一个区域:buffer
因为笔者目前还用不到这一部分的内容,所以就不详细介绍啦~