C++IO流

本文详细介绍了C++中的流,包括输入输出流、字符流和文件流的使用。讲解了如何进行标准输出和错误输出,重定向输入输出,字符类处理,格式控制以及字符串流的处理。同时,阐述了文件流的打开、关闭、读写操作,并展示了文件指针定位的方法。通过实例代码,演示了如何在C++中实现数据的读取、转换和文件的读写操作。
摘要由CSDN通过智能技术生成

目录

前言:

输入输出流

字符流

文件流


前言:

流:若干字节数据从一端到另一端

流类体系:

  • 流对象
  • 流运算符>> <<

输入输出流

ostream类:

  • cout
  • cerr
  • clog
  • cin
  • 字符类的处理
  1. 正常的操作
  2. 调用成员函数的方式
  • 格式控制字符
  1. 包含头文件iomanip
  2. 常用的格式控制,一种是调用成员函数的方式,另一种是流控制字符完成
  • 设置有效位数:setprecision(要设置的位数)
  • 设置精度:fixed结合steprecision

istream类: in

#include<iostream>
#include<iomanip>
using namespace std;
void testOstream(){

	cout << "标准输出" << endl;//重定向
	cerr << "标准错误输出" << endl;//不能重定向
	clog << "标准错误输出" << endl;//重定向为文件
}
void Freopen()//重定向
{
	freopen("1.txt", "r", stdin);
	int a=0, b=0;
	scanf("%d%d", &a, &b);//输入由文件完成
	freopen("2.txt", "w", stdout);
	printf("%d", a + b);
}
void teststr()//字符类的处理
{
	cout.put('a');
	cout.write("IHateYou", 4);//指定长度,超过部分不做输出
	cout.put(cin.get());
	//字符串
	while (cin.get() != '\n');//清空缓冲区
	char str[20] = "";
	cin.getline(str, 20);//必须是char*类型的数据
	cout.write(str, 20);
}
void testIomanip(){
	float c = 3.14159265359;
	cout << setprecision(4) << c << endl;//设置有效位数
	cout << fixed << setprecision(4) << c << endl;//设置精度
	//进制转化输出
	cout << hex << 15 << endl;//十六进制
	cout << oct << 12 << endl;//八进制
	cout << setbase(8) << 12 << endl;//8/10/16进制
	//对齐方式(默认右对齐)
	cout << setiosflags(ios::left);//设置为左对齐
	cout << setw(8) << "123"  << setw(8) << "1234" << setw(8) << "4321" << endl;
	cout << setw(8) << "1234" << setw(8) << "11234" << setw(8) << "43421" << endl;
}
int main(){
	testOstream();
	Freopen();
	teststr();
	testIomanip();




	while (1);
	return 0;
}

字符流

  • 用的头文件是sstream类
  1. istringstream类
  2. ostringstream类
  3. 一般用stringstream类对象即可
  • 获取字符流对象里的数据
  1. string str()    获取string
  2. void str(const string&str)  重新设置字符流对象的数据
  • 一般字符流对象做字符串处理
  1. 字符串分割
  2. 字符串转换问题
    #include<iostream>
    #include<sstream>
    using namespace std;
    void teststringstream(){
    	stringstream part(string("ILoveYou"));//构建字符流对象
    	cout << part.str() << endl;
    	stringstream null;
    	null << "我爱你";
    	cout << null.str() << endl;
    	string data;
    	null >> data;
    	cout << data << endl;
    	//字符串与数字间的转化
    	int num = 250;
    	char str[20] = "";
    	stringstream transs(str);
    	transs << num;
    	transs >> str;
    	cout << str << endl;
    	stringstream u("123");
    	int ai = 0;
    	u >> ai;
    	cout << ai<<endl;
    	//分割
    	stringstream ssr("12, 23, 34, 41, 56, 78");
    	int a[6];
    	char str1[5];
    	for (int i = 0; i < 6; i++){
    		if (i == 5)ssr >> a[i];
    		else ssr >> a[i]>>str1[i];
    	}
    	for (int i = 0; i < 6; i++){
    		cout << a[i] << " ";
    	}
    }
    
    int main(){
    	teststringstream();
    
    
    	while (1);
    	return 0;
    }

文件流

  • 流类体系
  1. ofstream类:output输出到文件
  2. ifstream类读操作
  3. fstream类可读可写 用的时候包含头文件#inlcude<fstream>
  • 打开关闭文件

打开文件:void open(const char* URL,ios::openmode mode);

  • 读写方法是:
  1. ios::in:读的方式打开文件
  2. ios::out:写的方式打开文件,具有创建功能
  3. ios::app:追加模式,具有创建功能
  4. ios::ate:打开已有文件,文件指针指向末尾
  5. ios::trunc:具有创建功能
  6. ios::nocreate:不具备创建功能
  7. ios::noreplace:不具备替换功能
  8. ios::binary:二进制的形式
  • 读写组合用  |
  1. 可读可写可创建:ios::in|ios::out|ios::trunc
  2. 二进制的可读可写可创建:ios::in|ios::out|ios::trunc|ios::binary
  • 判断文件是否打开成功:
  1. 用文件流对象重载的运算:   !
  2. is_open成员函数判断:
  • 返回true 表示文件打开成功
  • 返回false 表示文件打开失败

关闭文件:void close()

  • 读写文件
  1. 流的方式读写
  2. 二进制的方式读写
  • 把string写到文件:需要先转化成char*类型再写进去
    #include<iostream>
    #include<fstream>
    using namespace std;
    void testOpenFile(){
    	fstream  file;
    	file.open("1.txt", ios::out);
    	if (!file)cout << "文件打开失败!"<<endl;//也可以写成这样来判断if(!file.is_open())<< "文件打开失败!"<<endl;
    	file.close();
    }
    void test(const char* readFileName,const char*writeFileName){
    	fstream read(readFileName,ios::in);
    	fstream write(writeFileName,ios::out);
    	/*while (!read.eof()){
    		char k;
    		read >> k;
    		if (read.eof())break;
    		write << k;
    	}*/
    	/*while (1){
    		char key;
    		read.get(key);
    		if (read.eof())break;
    		write.put(key);
    	}*/
    	while (!read.eof()){
    		char str[1024] = "";
    		read.getline(str, 1024);
    		write.write(str, strlen(str));
    		write.put('\n');
    		
    	}
    	read.close();
    	write.close();
    }
    void testBinary(const char* readFileName, const char* writeFileName){
    	fstream readFile(readFileName, ios::in | ios::binary);
    	fstream writeFile(writeFileName, ios::out | ios::binary);
    	while (!readFile.eof()){
    		char str1[1024] = "";
    		readFile.getline(str1, 1024);
    		writeFile.write(str1, 1024);
    
    	}
    	readFile.close();
    	writeFile.close();
    }
    int main(){
    
    	//testOpenFile();
    	//test("read.txt","write.txt");
    	testBinary("read.txt", "write.txt");
    	while (1);
    	return 0;
    }

  •  文件指针定位

ifstream类的对象:

  • istream&seekg(long int pos)
  • isteam&seekg(long int pos,ios base::seekdir position)

ofstream类的对象:

  • ostream&seekg(long int pos)
  • ostream&seekg(long int pos,ios base::seekdir position)

ios base::seekdir

  • ios::beg  文件开始的位置    //C 语言中是SEEK_SET
  • ios::end  文件结束的位置
  • ios::cur   文件当前的位置
#include<iostream>
#include<fstream>
using namespace std;
void testSeek(const char* fileName){
	fstream UK(fileName, ios::in);
	if (!UK){ cout << "打开文件失败!" << endl; }
	char key=UK.get();
	cout << key;
	UK.seekg(4,ios::beg);
	key = UK.get();
	cout << key;
	UK.seekg(-4, ios::end);
	key = UK.get();
	cout << key << endl;
	UK.close();
}
int main(){

	testSeek("UK.txt");

	while (1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值