//请直接复制该文本代码到编译器进行编译执行参考
//更多内容请关注微信订阅号:没用的阿吉
#include<iostream>//IO标准库
#include<fstream>//文件IO标准库
#include<stdio.h>
#include<vector>//矢量头文件
#include<sstream>
#include<string>
#include<Windows.h>
int main() {
std::cout << "//开始学习IO标准库\n";
Sleep(100);
std::cout << "//1." << std::endl;
Sleep(100);
std::cout << "//istream/输入流\n";
Sleep(100);
std::cout << "//ostream/输出流\n";
Sleep(100);
std::cout << "//cin是istream输入流的对象,可以使用cin获取到我们在控制台输入给程序的信息\n";
Sleep(100);
std::cout << "//cout是ostream输出流的对象,可以使用cout在程序里把信息输出到控制台" << std::endl;
Sleep(100);
std::cout << "//cerr是ostream输出流的对象,可以使用cerr输出程序的错误信息" << std::endl;
Sleep(100);
std::cout << "//<<运算符可以对ostream对象输出信息" << std::endl;
Sleep(100);
std::cout << "//>>运算符可以对istream对象输入信息" << std::endl;
Sleep(100);
std::cout << "//getline()函数可以让isream对象按每一行读取数据" << std::endl;
Sleep(100);
std::cout << std::endl;
Sleep(100);
std::cout << "上面是IO类型经常在控制台使用它定义在#include<iostream.h>头文件中" << std::endl;
Sleep(100);
std::cout << "//C++的IO标准库分别定义了三种IO类型" << std::endl;
Sleep(100);
std::cout << "//另外的两种在另外两个头文件中,如下:" << std::endl;
Sleep(100);
std::cout << "//文件IO类型头文件:#include<fstream.h>" << std::endl;
Sleep(100);
std::cout << "//ifstream/文件读取" << std::endl;
Sleep(100);
std::cout << "//ofstream/文件写入" << std::endl;
Sleep(100);
std::cout << "//fstream/文件读写" << std::endl;
Sleep(100);
std::cout << std::endl;
Sleep(100);
std::cout << "//读写string对象内存IO类型头文件:#include<sstream.h>" << std::endl;
Sleep(100);
std::cout << "//istringstream/数据读取" << std::endl;
Sleep(100);
std::cout << "//ostringstream/数据写入" << std::endl;
Sleep(100);
std::cout << "//stringstream/读写string对象" << std::endl;
Sleep(100);
std::cout << std::endl;
Sleep(100);
std::cout << "//Prompt:上面的函数同时定义了长类型字符输出在上面所有操作的前面加上w即可" << std::endl;
Sleep(100);
std::cout << "//实际上我们输出长字符的使用方式和上面方法一致,因为IO标准库使用了继承机制。\n" << std::endl;
Sleep(100);
std::cout << "//举例一个错误!在下面输入非整型字符会引发错误" << std::endl;
Sleep(100);
std::cout << "//因为下面我们cin输入给的类型是一个int类型" << std::endl;
Sleep(100);
std::cout << "//所以我们输入非int类型就会引发错误,是吧一个int类型怎么装不是int类型的值呢?" << std::endl;
Sleep(100);
std::cout << ">> 请输入一个非整型字符用以测试:" << std::endl;
Sleep(100);
std::cout << ">> 继续请输入一个整型:" << std::endl;
int ival; std::cin >> ival;//给ival进行输出测试错误。
std::cout << "//IO流一旦出现错误则无法再继续" << std::endl;
Sleep(100);
std::cout << "//只有没有出现错误的IO我们程序才可以继续\n" << std::endl;
Sleep(100);
std::cout << "//通常使用while作为条件解决这个错误" << std::endl;
Sleep(100);
std::cout << "//输入示例:" << std::endl;
while (std::cin >> ival) {
std::cout << "//输入正确" << std::endl;
Sleep(100);
std::cout << "//如果输入正确则while循环条件为bool条件的真" << std::endl;
Sleep(100);
std::cout << "//如果输入错误则无法触发while条件接下来程序的所有IO都失效无法使用" << std::endl;
}
std::cout << "//输入错误继续学习" << std::endl;
Sleep(100);
std::cout << "//我们需要知道到底发生了什么错误" << std::endl;
Sleep(100);
std::cout << "//我们使用while循环只能知道IO流是否有效但是不知道具体发生了什么" << std::endl;
Sleep(100);
std::cout << "//IO标准库中的iostate类型可以用来知道流的状态" << std::endl;
Sleep(100);
std::cout << "//iostate类型有4种使用方法是一种位运算条件的常量表达式constexpr" << std::endl;
Sleep(100);
std::cout << "//如下:" << std::endl;
Sleep(100);
std::cout << "//1.badbit表示系统级别的错误badbit发生置位整个IO将无法使用无法修复" << std::endl;
Sleep(100);
std::cout << "//2.failbit被置位是可以修复的这种错误是期望输入的类型不对导致" << std::endl;
Sleep(100);
std::cout << "//3.eofbit是文件结束的原因导致eofbit被置位值得一提的是文件结束eofbit和failbit都会被置位" << std::endl;
Sleep(100);
std::cout << "//4.goodbit的值是0的时候表示IO流没有任何错误" << std::endl;
Sleep(100);
std::cout << "//当badbit/failbit/eofbit/这三个有一个被置位那么IO流的条件将无法检测\n" << std::endl;
Sleep(100);
std::cout << "//检测操控IO状态:" << std::endl;
Sleep(100);
std::cout << "//IO标准库定义了许多IO输入cin对象的函数成员提供我们用来改变和检测流的状态" << std::endl;
Sleep(100);
std::cout << "//如下:" << std::endl;
Sleep(100);
std::cout << "//1.IO对象的rdtate函数成员可以返回iostate的值就是说一个流的状态" << std::endl;
Sleep(100);
std::cout << "//2.IO对象的setstate函数成员可以让一个给定的iostate类型置位" << std::endl;
Sleep(100);
std::cout << "//3.IO对象的clear函数成员有一个重载,当clear没有给任何参数的时候则复位所有iostate状态" << std::endl;
Sleep(100);
std::cout << "//clear的重载可以输入iostate状态给当前的iostate类型状态进行复位" << std::endl;
Sleep(100);
std::cout << "//4.IO对象的ignore函数,消除上一次的输入缓存,显而易见我们对流的状态进行复位是不够的不消除上次输入的缓存会影响下一次的输入" << std::endl;
std::cin.clear();//clear()不给任何形参这里就表示清空所有的错误
std::cin.ignore();//sync()消除cin中的所有缓存
Sleep(100);
std::cout << "//程序执行到这里前面我们的IO错误已经恢复因为我们调用了clear成员函数进行了全部复位但是我们的结束符也无法让程序停下来\n" << std::endl;
Sleep(100);
std::cout << "//下面我们制作新的错误演示让输入结束后使得程序可以结束恢复结束符的功能" << std::endl;
Sleep(100);
std::cout << "//这里请输入一个非整型的字符形成IO错误但是会被修复" << std::endl;
Sleep(100);
std::cout << "//在这里输入结束符程序会结束,我们保留了结束符的功能" << std::endl;
Sleep(100);
std::cout << "//输入一个非整型或者结束符(ctrl+z)测试:" << std::endl;
while (std::cin >> ival) {
std::cout << "//请输入一个错误的字符" << std::endl;
}
//修复流
std::cin.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
std::cin.ignore();//sync()消除cin中的所有缓存
std::cout << "//已经引发错误接下来程序运行到最后没有结束则说明被修复" << std::endl;
Sleep(100);
std::cout << "//为了确定流是否可以正常使用我们下面再次使用一个while循环进行cin输入测试" << std::endl;
Sleep(100);
std::cout << "//输入一个整型进行:" << std::endl;
while (std::cin >> ival) {
std::cout << "//可以使用" << std::endl;
Sleep(100);
std::cout << "//输入一个非整型继续:" << std::endl;
}
//修复流并保留结束符的功能
std::cin.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
std::cin.ignore();//sync()消除cin中的所有缓存
//演示cerr
std::cerr << "//cerr是用来输出程序中的一个错误消息的因此cerr不用在后面写endl来刷新缓冲区";
Sleep(100);
//演示cout
std::cout << "//没有在结尾加endl的cout输出有可能在缓冲区等待缓存区满了才输出也有可能立即输出";
Sleep(100);
std::cout << "//在cout输出的结尾加上endl表示立即输出并且刷新缓存区并且换行" << std::endl;
Sleep(100);
std::cout << "//在cout输出的结尾加上ends可以立即刷新缓冲区并且添加一个空格" << std::ends;
Sleep(100);
std::cout << "//在cout输出的结尾加上flush可以立即刷新缓冲区但是不添加任何换行或者其他功能" << std::flush;
Sleep(100);
std::cout << "\n\n//使用unitbuf至nouitbuf之间的输出代码都立即刷新" << std::endl;
Sleep(100);
std::cout << "//方法演示:" << std::endl;
Sleep(100);
std::cout << std::unitbuf;//从这里开始任何cout输出每次都被立即输出立即刷新缓冲区
std::cout << "//该区域的输出代码都会被立即刷新缓冲区立即输出";
std::cout << std::nounitbuf;//到这里恢复默认IO输出方式
Sleep(100);
std::cout << "\n//输入流关联到输出流时读取输入流的数据会导致输出流立即被刷新" << std::endl;
Sleep(100);
std::cout << "//IO流的的tie函数有两个重载:" << std::endl;
Sleep(100);
std::cout << "//1.tie函数不给参数时会返回流的指针如果这个流对象和输出流有关联着tie返回这个流对象的指针否则返回一个空的指针" << std::endl;
Sleep(100);
std::cout << "//2.tie函数可以接受一个ostream类型的输出对象表示关联到这个输出对象" << std::endl;
Sleep(100);
//测试是否返回指针
auto coutp = std::cout.tie();
std::cout << "//输出流的指针:" << coutp << std::endl;//结果为空
Sleep(100);
//将输入流关联到输出流
//std::cin.tie(&std::cout);
//测试是否返回指针
//auto coutp = std::cout.tie();
//std::cout << "//输出流的指针:" << coutp << std::endl;//结果为空
std::cout << "2." << std::endl;
Sleep(100);
std::cout << "//2.学习文件IO" << std::endl;
Sleep(100);
std::cout << "//文件IO头文件是fstream而且操作与iostream的操作一致但是比iostream多一些成员函数" << std::endl;
Sleep(100);
std::cout << "//文件IO标准库fstream头文件一共包含了三种IO类型" << std::endl;
Sleep(100);
std::cout << "//如下:" << std::endl;
Sleep(100);
std::cout << "//1.ifstream读取数据" << std::endl;
Sleep(100);
std::cout << "//2.ofstream写入数据" << std::endl;
Sleep(100);
std::cout << "//3.fstream读写数据" << std::endl;
Sleep(100);
std::cout << "//文件IO同样可以使用我们之前的<<与>>读写文件数据" << std::endl;
Sleep(100);
std::cout << "//演示文件IO代码" << std::endl;
Sleep((100));
std::string ifile = "9876";
std::ifstream in(ifile);//创建流in且给定一个string类型ifile
std::ofstream out;//输出文件流
out.open(ifile + ".abcd");//打开文件
if (out) {//与之前使用的cin条件类似这里是检测open的状态
//检测open是否成立
std::cout << "open成功" << std::endl;
}
else {
std::cout << "open失败" << std::endl;
}
Sleep(100);
in.close();//一个流如果失败就会无法继续使用则需要关闭流,这里用close关闭
in.open(ifile + "1");//当流可以使用才能重新使用流打开新的文件
std::cout << "//查看流的状态" << std::endl;
Sleep(100);
auto goodTream = std::cin.good();//当流的bad和fail还有eof都没有被置位的时则good状态为true
std::cout << "流的good状态:" << goodTream << std::endl;
Sleep(100);
std::cout << "//用fail查看流的状态" << std::endl;
Sleep(100);
auto failTream = std::cin.fail();//如果流的badbit被置位则fail也会被置位
std::cout << "流的fail状态:" << failTream << std::endl;
Sleep(100);
//文件创建与绑定
std::cout << "//创建一个文件流" << std::endl;
Sleep(100);
std::string ifile_2("12345");
std::cout << "//创建一个流给定文件这个文件可以是一个string类型对象也可以是一个c风格字符串类型对象" << std::endl;
Sleep(100);
std::ifstream in_2(ifile_2);//创建一个文件流
std::cout << "//表示输出文件没有绑定任何文件" << std::endl;
Sleep(100);
std::ofstream out_2;//表示输出流没有给绑定任何文件
Sleep(100);
std::cout << "//打开指定的文件" << std::endl;
Sleep(100);
out_2.open(ifile_2 + "asdf");
Sleep(100);
std::cout << "//检测流的状态" << std::endl;
if (out_2) {//与之前使用的cin条件类似这里是检测open的状态
//检测open是否成立
std::cout << "//open成功" << std::endl;
Sleep(100);
std::cout << "//文件可以使用" << std::endl;
}
else {
std::cout << "//open失败" << std::endl;
}
Sleep(100);
std::cout << "//预打开新的文件准备" << std::endl;
Sleep(100);
std::cout << "//清空流的状态预打开新的文件流" << std::endl;
Sleep(100);
in_2.close();
std::cout << "//打开新的文件" << std::endl;
Sleep(100);
in_2.open(ifile_2 + "lkjh");
//演示stringIO流的使用
struct PersonInfo {
std::string name;
std::vector<std::string> phones;//使用矢量定义载着号码的变量
};
Sleep(100);
std::cout << "//演示cin输入与各类型" << std::endl;
Sleep(100);
std::cout << "//请对char类型的ch输入385:" << std::endl;
char ch;
std::cin >> ch;
std::cout << "//输出ch:" << ch << std::endl;
Sleep(100);
//修复流
std::cin.get(ch);//防止cin流多余的字符流入下一个cin流
std::cin.clear();//复位相关状态
std::cin.ignore();//sync()消除cin中的所有缓存
std::cout << "//cin流可再次被使用" << std::endl;
Sleep(100);
std::cout << "//请对int类型的n输入385:" << std::endl;
int n;
std::cin >> n;
std::cout << "//输出n:" << n << std::endl;
Sleep(100);
//修复流
std::cin.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
std::cin.ignore();//sync()消除cin中的所有缓存
std::cout << "//cin流可再次被使用" << std::endl;
Sleep(100);
std::cout << "//请对dauble类型的x输入38.5:" << std::endl;
double x;
std::cin >> x;
std::cout << "//输出x:" << x << std::endl;
Sleep(100);
//修复流
std::cin.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
std::cin.ignore();//sync()消除cin中的所有缓存
std::cout << "//cin流可再次被使用" << std::endl;
Sleep(100);
std::cout << "//从上面分别的cin输入我们可以知道需要根据不同的类型进行cin输入否则会导致错误" << std::endl;
Sleep(100);
std::cout << "//重新出发继续研究IO文件流相关知识" << std::endl;
Sleep(100);
std::cout << "//使用IO文件流必须包含fstream头文件就像我们之前使用iostream头文件那样" << std::endl;
Sleep(100);
std::cout << "//之前我们使用iostream头文件的ostream对象cout进行IO输出到屏幕" << std::endl;
Sleep(100);
std::cout << "//则我们使用文件IO流与之类似 可以使用在fstream头文件的ofstream类进行声明一个或多个文件IO流对象(我们需要自己命名)得到类似使用过的cout对象" << std::endl;
Sleep(100);
std::cout << "//演示声明定义文件IO如下:" << std::endl;
Sleep(100);
std::ofstream file_1;//记得写命名空间std::(这里的file_1就类似前面使用过的cout只是file_1名字是自己喜欢的定义的而且是用做文件IO流的)
std::cout << "//声明的文件IO流对象后需要将它与文件进行捆绑使用对象的成员open函数进行捆绑" << std::endl;
Sleep(100);
std::cout << "//文件流使用结束后是需要关闭的即使用对象的成员close函数关闭" << std::endl;
Sleep(100);
std::cout << "//演示:" << std::endl;
Sleep(100);
file_1.open("fish.txt");//我们使用之前声明的file_1对象的成员函数open给file_1捆绑文件为fish.txt
std::cout << "//对象的成员函数open接受c风格字符串或string对象作为参数" << std::endl;
Sleep(100);
std::cout << "//演示捆绑到c风格字符串:\n请给c风格对象输入一些值:" << std::endl;
std::ofstream file_2;//创建文件IO流
char chFile[50];//c风格字符串
std::cin >> chFile;//为chFile字符串对象设值
file_2.open(chFile);//将文件流对象file_2捆绑到c风格字符串文件chFile对象
Sleep(100);
//修复流
std::cin.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
std::cin.ignore();//sync()消除cin中的所有缓存
std::cout << "//演示捆绑到string:\n请给string对象输入一些值:" << std::endl;
std::ofstream file_3;//创建文件IO流
std::string strFile;//string对象
std::cin >> strFile;//为strFile对象对象设值
file_3.open(strFile);//将文件流对象file_2捆绑到c风格字符串文件chFile对象
Sleep(100);
//修复流
std::cin.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
std::cin.ignore();//sync()消除cin中的所有缓存
std::cout << "//演示文件流如何使用<<输入符" << std::endl;
double wt = 125.8;
file_1 << wt << std::endl;
char line[100] = "helo qwertyuiopasdfghjklzxcvbnm";
file_2 << line << std::endl;//可见自定义的file_2与之前使用cout方式相近
file_1 << "//执行到这里文件fish.txt已经包含内容且可以找到它在程序运行时创建在当前目录下" << std::endl;
file_1 << "//且之后我们的学习笔记将通过这个文件进行记录fish.txt" << std::endl;
file_1 << "\n//学习与cin流类似的文件流" << std::endl;
file_1 << "//演示:" << std::endl;
//声明
std::ifstream infile;//创建文件流未捆绑文件
infile.open("infile.txt");
//is_open类似good用来检查状态的
if (!infile.is_open()) {
file_1 << "inFile.open成功" << std::endl;
}
std::string str_2;
while (infile >> str_2) {
file_1 << str_2 << std::endl;
}
//修复流
infile.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
infile.ignore();//sync()消除cin中的所有缓存
////////////////////////////////////
//将fish.txt文件中的内容打印到控制台
std::ifstream fish;
fish.open("fish.txt");
//is_open类似good用来检查状态的
if (!fish.is_open()) {
file_1 << "fish.open()成功" << std::endl;
}
std::string str_3;
while (fish >> str_3) {
Sleep(100);
std::cout << str_3 << std::endl;
}
//修复流
fish.clear(std::cin.rdstate() & ~std::cin.failbit & ~std::cin.badbit);//复位相关状态但是不复位eofbit是为了保留结束生效
fish.ignore();//sync()消除cin中的所有缓存
//关闭文件流
file_1.close();
file_2.close();
file_3.close();
return 0;
}
//开始学习IO标准库
//1.
//istream/输入流
//ostream/输出流
//cin是istream输入流的对象,可以使用cin获取到我们在控制台输入给程序的信息
//cout是ostream输出流的对象,可以使用cout在程序里把信息输出到控制台
//cerr是ostream输出流的对象,可以使用cerr输出程序的错误信息
//<<运算符可以对ostream对象输出信息
//>>运算符可以对istream对象输入信息
//getline()函数可以让isream对象按每一行读取数据
上面是IO类型经常在控制台使用它定义在#include<iostream.h>头文件中
//C++的IO标准库分别定义了三种IO类型
//另外的两种在另外两个头文件中,如下:
//文件IO类型头文件:#include<fstream.h>
//ifstream/文件读取
//ofstream/文件写入
//fstream/文件读写
//读写string对象内存IO类型头文件:#include<sstream.h>
//istringstream/数据读取
//ostringstream/数据写入
//stringstream/读写string对象
//Prompt:上面的函数同时定义了长类型字符输出在上面所有操作的前面加上w即可
//实际上我们输出长字符的使用方式和上面方法一致,因为IO标准库使用了继承机制。
//举例一个错误!在下面输入非整型字符会引发错误
//因为下面我们cin输入给的类型是一个int类型
//所以我们输入非int类型就会引发错误,是吧一个int类型怎么装不是int类型的值呢?
>> 请输入一个非整型字符用以测试:
>> 继续请输入一个整型:
5
//IO流一旦出现错误则无法再继续
//只有没有出现错误的IO我们程序才可以继续
//通常使用while作为条件解决这个错误
//输入示例: