C++ -----文件IO

1流的概念

  • 流:数据从一个对象到另一个对象的传输。
  • 功能:标准输入输出+文件处理

1.1流分类

  • 标准库定义了三大类流类型:标准I/O流、文件流、字符串流
    在这里插入图片描述

2流对象

2.1分类

  • 通常标准I/O流对象是全局对象不需要定义,
  • 而文件流对象和字符串流对象需要用户定义。
  • 流对象通常都不能复制。
全局流对象 名称 缓存
cout 标准输出流 带缓存
cin 标准输入流 带缓存
clog 标准日志流 带缓存
cerr 标准错误流 无缓存

2.2流对象状态

流对象状态在某一个时刻必定处于以下四个状态之一。

No. 状态 含义
1 good() 前一个流操作成功
2 eof() 到输入尾/文件尾
3 fail() 发生意外事情(读取失败)
4 bad() 发生意外严重事情(磁盘读取失败)

2.3标准输入

2.3.1 成员函数

#include<iostream>
using namespace std;
void test01(){
	char c=cin.get();//一次只能取一个字符
	cout<<"c= "<<c<<endl;//也可以得到换行符 因为换行符也是一个字符 
	
}
void test02(){
	char buf[1024];
	cin.get(buf,1024);
	char c=cin.get();
	if(c=='\n'){//读取字符串不会把换行符取走 换行符还遗留在缓冲区
		cout<<"换行符在缓冲区"<<endl;
	}
	cout<<buf<<endl;
	
}
void test03(){
	char buf[1024];
	cin.getline(buf,1024);
	char c=cin.get();
	if(c=='\n'){//读取字符串把换行符取走 并扔掉 等待下次输入
		cout<<"换行符在缓冲区"<<endl;
	}
	cout<<buf<<endl;	
}
void test04(){
	cin.ignore(2);//没有参数代表忽略一个字符 有参数代表N个字符
	char c=cin.get();
	cout<<"c= "<<c<<endl;

}
//cin.peek 偷窥
void test05(){
	char c=cin.peek();//比如:输入a 然后偷看一眼a 然后将它在放入缓冲区	
	cout<<"c= "<<c<<endl;
	c=cin.get();
	cout<<"c= "<<c<<endl;

}
//cin.putback放回
void test06(){
	char c=cin.get();
	cin.putback(c);//将字符放回缓冲区
	char buf[1024];
	cin.getline(buf,1024);
	cout<<buf<<endl;
}

void test07(){
	//缓冲区标志类
	cin.clear();//清空标志位
	cin.sync();//刷新缓冲区
	cout<<cin.fail()<<endl;

}
int main(){
test06();
}

2.4标准输出

  • 格式化输出有两种方法

2.4.1流对象有关的成员函数

在这里插入图片描述

  • 参数
    在这里插入图片描述
#include<iostream>
#include<iomanip>
using namespace std;//格式化输出流 使用控制符方式格式化输出的头文件

//cout.put
//cout.write
void test1(){
	int num=99;
	cout.width(20);
	cout.fill('*');
	cout.setf(ios::left);
	cout.unsetf(ios::dec);
	cout<<num<<endl;
}

2.4.2控制符方法

在这里插入图片描述

void test2(){
	int number=99;
	cout<<setw(20)//设置宽度
	    <<setfill('X')//填充
	    <<hex//16进制
		<<number<<endl;
}
int main(){
	test2();
}

3文件流

在这里插入图片描述

#include<iostream>
#include<fstream>//文件读写的头文件
using  namespace std;

//写文件
void test01(){
	//方式一	
	//ofstream ofs("./text.txt",ios::out|ios::trunc);	
	//方式2
	ofstream ofs;
	ofs.open("./text.txt",ios::out|ios::trunc);	
	if(!ofs.is_open()){
		cout<<"文件打开失败"<<endl;
	}
	//写文件
	ofs<<"姓名旅客"<<endl;
	ofs<<endl;
	//关闭流对象
	ofs.close();
}
//读文件
void test02(){
	ifstream ifs;
	ifs.open("./text.txt",ios::in);	
	if(!ifs.is_open()){
		cout<<"文件打开失败"<<endl;
		return ;
	}
	
	//第一种方法将每行读取到缓冲区中 按行读取 知道读到文件结尾
	char buf[1024];
	while(ifs>>buf){
		cout<<buf<<endl;
	}
	
	/*
	//第二种方法
	char buf[1024];
	while(!ifs.eof()){
		ifs.getline(buf,sizeof(buf));
	}
	*/
	/*
	//第3种方式单个字符的读取
	char c;
	while((c=ifs.get())!=EOF){
		cout<<c;
	}
	*/	
	cout<<endl;	
	ifs.close();
}
int main(){
test01();
test02();
}
发布了70 篇原创文章 · 获赞 6 · 访问量 3823
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 1024 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览