行业知识
【C++】万字详解IO流(输入输出流+文件流+字符串流)
2026-10-28 10:53:43
来源:互联网转载
文章目录
- 一、标准输入输出流
- 1.1提取符>>(赋值给)与插入符 a
- 理解ifstream(读) >> a
- 例子
- 1.2get系列函数
- get与getline函数细小但又重要的区别
- 1.3获取状态信息函数(处理流错误)
- 例子:检测输入输出状态
- 例子:确保一个整型数给变量a
- 二、文件输入输出流
- 2.1文件打开
- 2.2关闭文件
- 2.3文本文件的读写
- 例子:写文本文件,把学生信息保存到文件当中
- 例子:读文本文件并显示在屏幕上
- 2.4二进制文件
- 例子:写二进制文件
- 例子:读二进制文件
- 二进制文件和普通文件的区别
- 2.5寻找输入输出流缓冲(这样就可以不用给缓冲区流向数据了)
- 2.6定位输入输出流
- 例子:先写文件再读文件(用rdbuf读)
- 三、字符串输入输出流(理解成动态字符串)
- 3.1例子:反解字符串给各变量赋值
- 3.2例子:合并不同类型的数据到字符串
- 3.3例子:字符切割(类3.1)
- 3.4例子:使用stringstream进行类型转换
- 3.5综合例子:读入每个学生的各科成绩,并显示学生各科成绩及总成绩
- 方法二:利用文件流+重载输入输出流
- 四、总结
- 答案一:哪些流
- 答案二:stringstream与其他的区别
- 答案三:stringstream初始化
- 答案四:文件流关联文件
- 答案五:文件流指定文件打开方式
- 答案六:控制流的游标位置
- 答案七:流的标志位及如何检测
- 答案八:文件和字符串流读写数据
- 答案九:read和write操作
- 答案十:stringstream的类型转换
- 答案十一(对我来说很重要,因为之前用string的时候没有传大小)
- 答案十二:class私有怎么重载
- ���案十三:如何访问流的缓冲区
一、标准输入输出流
流的概念:若干个字节组成的一个字节序列,代表信息从源到目的的流动
头文件 iostream
从标准输入读取流 cin >> //把空格、换行作为分隔符(不读空格)
从标准输出写入流 cout
h31.1提取符>(赋值给)与插入符> 这个符号是插入符呢?这个不应该是写是插入吗?请听我娓娓道来:我们将cin理解成写 是从用户的角度理解 因为我们一写 cin 我们就会调用控制台console从黑框中写入东西 所以我们觉得 >> 这个是写 但是cin >> a 的本质是:(注:cin在这里先当作ifstream )我们先从黑框中写入,黑框的数据拷贝给了ifsream流文件:test.txt 接着我们把 test.txt 的文件内容 >> 内存变量,即流向了变量a。总的来说:对于用户调用consolea来说:是写;但是对于文件test.txt流向内存变量:是读(是test.txt赋值给变量a),我们考虑的正是后者!(图片里面的instream写错了,应该是ifstream)
理解cin >> a
粗暴点讲:我们的cin就是调用键盘然后写入,但是我们的操作符 >> 这个可是提取,提取我们键盘输入的信息
cin >> a :1.调用键盘 2.赋值
理解ifstream(读) >> a
把ifstream>>a理解成一个过程 而且这个过程正是cin>>a的第二个过程,我们探讨的数据的流向和键盘与显示器无关,而是探讨数据内存之间的流向
总的来说:
- 运算符i,是把键盘输入的信息赋值给i
例子
//应用 class Stu{string name;int score;public:Stu(string n="",int s=0){name=n,score=s;} //构造//小羊谨记:写这俩个运算符重载的时候 一定得在返回值和俩个参数都加上引用!friend istream& operator>>(istream& in,Stu& s); //声名友元函数 要加关键字friend friend使得外部函数可以访问friend ostream& operator(istream& in,Stu& s){ in >> s.name >> s.score;return in;}ostream& operator out Stu s;cins; //但是cin不理解怎么读取Stu型,所以要对cin进行重载(详情见上面)cout unsigned char buf1[5]; cout unsigned char buf1[10]; unsigned char buf2[10]; cin.getline((char*)buf2, 10); cout unsigned char buf1[10]; unsigned char buf2[10]; cin.get((char*)buf1, 10); cout int a;ifstream file("D:\vs code_code\Teacher_DiXW\a.txt");file a;coutcoutcoutchar BUFF[60];int a;while(1){cina;if(cin.fail()){coutcout ofstream out("D:\vs code_code\Teacher_DiXW\lzy.txt"); if (out) { out char buffer[256]; ifstream in("D:\vs code_code\Teacher_DiXW\lzy.txt"); if (in) { while(!in.eof())//确保访问到文件末尾 { in.getline(buffer,100);//in buffer ; cout char strName[20]; int nGrade;};int main(){ ofstream out; out.open("D:\vs code_code\Teacher_DiXW\lzy.txt"); STUDENT st1={"张三",90}; STUDENT st2={"李四",80}; out char szBuf[80]; ifstream in("D:\vs code_code\Teacher_DiXW\lzy.txt"); if(in) { while(in.getline(szBuf,80)) { coutstruct Worker w[3]={"zhang",2500,20,"lisi",4500,22,"wang",2500,23};ofstream out("D:\vs code_code\Teacher_DiXW\lzy.txt",ios::binary);//后缀表明是二进制文件for(int i=0;i//out //读文件ifstream in("D:\vs code_code\Teacher_DiXW\lzy.txt",ios::binary);Worker temp;for(int i=0;i in.read((char*)&temp,sizeof(Worker)); cout ifstream in("D:\vs code_code\Teacher_DiXW\lzy.txt"); if(in) { cout string a("hello"); fstream in_out; in_out.open("D:\vs code_code\Teacher_DiXW\lzy.txt",ios::in | ios::out | ios::trunc);//trunc保证了没有该文件,则自动创建该文件 in_out int n; float f; string str; string strText="13.14 hello"; istringstream s(strText); s n;//n是int类型 s f;//f是float类型 s str;//str是字符串类型 cout cout //2.用的多的情况 是用来做类型转换 或者 字符切割 //to_string 数字转换成字符串 //cout char get_char; ip ipNum[i];//ip ipnum[1] ipnum[2] ipnum[3] ipnum[4]; if(i