C++IO流

C++IO流

文章目录


一、IO流

流:若干字节数据从一端到另一端叫做流,数据的流动
流类体系

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

二、输入输出流

  • ostream类
    • cout
    • cerr
    • clog
    • cin
    • 字符类的处理
      • 正常的操作
      • 调用成员函数的方法
    • 格式控制符
      • 包含头文件iomanip
      • 常用的格式控制,一种是调用成员函数方式,一种流控制字符去做
        • 设置有效位数:setprecision(n)
        • 设置精度:fixed结合setprecision使用
  • istream 类 cin
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
using namespace std;
void testOstream()  //output
{
	//freopen()
	cout << "标准输出" << endl;			//重定向
	cerr << "标准错误输出" << endl;		//不能重定向
	clog << "标准错误输出" << endl;		//重定向为文件
	//字符类的处理
	cout.put('a');
	cout << 'a' << endl;
	char c = 'C';
	cout.put(c);
	cout << c << endl;
	cout.write("onetwothree", 5);	//指定长度,超过长度不做输出
	cout << endl;
	//输入
	cout.put(cin.get());
	cout << endl;
	//字符串
	while (cin.get() != '\n');
	while (getchar() != '\n');
	char str[20]="";
	cin.getline(str, 20);
	cout.write(str,20);
}

void testiomanip()
{
	//格式控制符
	//设置格式
	double pi = 34.12343;
	cout << "设置有效位数:" << setprecision(4) <<  pi <<endl;
	cout << "有效小数位"<< fixed << setprecision(4) << pi << endl;
	// cout.precision(4); 所有的流控制符都会对应一个成员函数的方式
	//进制输出
	cout << hex << 32 << endl;	//十六进制
	cout << oct << 15 << endl;	//八进制输出
	cout << setbase(8) << 16 << endl;	//8-16
	//默认右对齐
	//cout.with(8)
	//cout << resetiosflags << endl;
	cout << setiosflags(ios::left); //ios::right
	cout << setw(8) << "123" << setw(8) << "12345" << setw(8) << "3444" << endl;
	cout << setw(8) << "123" << setw(8) << "12345" << setw(8) << "3444" << endl;

}

int main()
{

	//testOstream();
	testiomanip();
	/*freopen("1.txt","r",stdin);
	int a, b;
	scanf("%d%d", &a, &b);
	cout << a + b << endl;*/
	while (1);
	return 0;
}

运行结果:
C++IO流

二、字符流

  • 用的头文件是::sstream类
    • istringstream类
    • ostringstream类
    • 一般用的是stringstream类对象即可
  • 获取字符流对象中的数据
    • string str() //获取string
    • void str(const string& str); 重新设置字符流对象的数据
  • 一般字符流对象做字符串处理
    • 字符串分割
    • 字符串转换问题
#include <iostream>
#include <sstream>
using namespace std;
//23,132,3443,54,54,65
void teststringstream()
{
	//构建字符流对象,以及获取字符流对象中的数据
	stringstream sso(string("onetwothree"));
	cout << sso.str() << endl;
	stringstream ssnull;
	ssnull << "aaaa" << endl;
	cout << ssnull.str() << endl;
	//错误
	//stringstream ss=string("bbbbb");
	string data;
	ssnull >> data;
	cout << data << endl;
	ssnull.str("bbbb");
	//ssnull.clear();
	cout<<ssnull.str() << endl;
	//字符串与数字之间的转换
	//字符串转数字
	int num = 1234;
	char input[20] = "";
	stringstream transs(input);
	transs << num;
	transs >> input;
	cout << input << endl;
	//数字转字符串
	stringstream snum("12345");
	int temp = 0;
	snum >> temp;
	cout << temp << endl;
	//分割
	stringstream sData("23,132,3443,54,54,65");
	int numdata[6];
	char cData[5];
	for (int i = 0; i < 6; i++)
	{
		if (i == 5)
		{
			sData >> numdata[i];
		}
		else
			sData >> numdata[i] >> cData[i];
	}
	for (int i = 0; i < 6; i++)
	{
		cout << numdata[i] << " ";
	}
	cout << endl;
	//多次对同一个流做数据转换操作,一定做clear操作
	transs.clear();		//做重置操作
	transs << num;
	transs >> input;
	cout << input << endl;
}
int main()
{
	teststringstream();

	while (1);
	return 0;
}

运行结果:
C++IO流

三、文件流

  • 流泪体系
    • ofstream类 写操作 output输出到文件
    • ifstream类 读操作
    • fstream类 可读可写 用的时候包含头文件 #include
  • 打开关闭文件
    • 打开文件:void open(sonst char *URL,ios::openmode mode);
      • 读写的方式是
      • ios::in 读的方式打开文件
      • ios::out 写方式打开文件 具有创建功能
      • ios::app 追加模式 具有在创建功能
      • ios::ate 追加模式,文件指针指向末尾
      • ios::trunc 具备创建功能
      • ios::nocreate 不具备创建
      • ios::noreplace 不替换(类似C语言文件操作w方式)
      • ios::binary 二进制的形式
    • 读写的组合方式用的是
      • 可读可写: ios::in|ios::out|ios::trunc
      • 二进制的可读可写可创建: ios::in|ios::out|ios::trunc|ios::binary
    • 判断打开文件是否成功
      • 用文件流对象重载的运算
      • is_open成员函数判断
        • 返回ture 打开成功
        • 返回false 打开失败
    • 关闭文件:void:void close()
  • 读写文件
    • 流的方式读写
    • 二进制方式读写
    • 把string写到文件
      • 需要先转换为char* 再写进去
  • 文件指针定位
    • istream类的对象
      • istream& seekg(long int pos);
      • istream& seekg(long int pos,ios_base::seekdir position);
    • ofstream类的对象
      • ostream& seekp(long int pos);
      • ostream& seekp(long int pos,ios_base::seekdir position);
    • iosbase::seekdir
      • ios::beg 文件开始位置 //SEEK_SET
      • ios::end 文件结束位置
      • ios::cur 文件当前位置
#include<iostream>
#include<fstream>
#include <cstring>
using namespace std;
void testOpenFile()
{
	fstream file;
	file.open("2.txt", ios::out);
	if (!file)
	{
		cout << "文件打开失败" << endl;
		return;
	}
	file.close();
}

void  asciRWFile(const char* readFileName, const char* writeFileName)
{
	fstream read(readFileName, ios::in);
	fstream write(writeFileName, ios::out);
	/*成员函数 eof() 在文件末尾
	1.流的方式读写
	1.1 空格和换行会被忽略*/
	/*while (1)
	{
		char key;
		read >> key;
		if (read.eof())
		{
			break;
		}
		write << key;
	}
	while (1)
	{
		char key;
		read.get(key);
		write.put(key);
		if (read.eof())
			break;
		write.put(key);
	}*/
	char str[1024] = "";
	while (!read.eof())
	{
		read.getline(str, 1024);
		write.fstream::write(str, strlen(str));
		write.put('\n');
	}
	read.close();
	write.close();
}
void binaryRWFile(const char* readFileName, const char* writeFileName)
{
	fstream readFile(readFileName, ios::in|ios::binary);
	fstream writeFile(writeFileName, ios::out | ios::binary);
	while (!readFile.eof())
	{
		char str[1024] = "";
		readFile.read(str, 1024);
		writeFile.write(str, 1024);
	}
	readFile.close();
	writeFile.close();
}
void testSeekRead(const char* fileName)
{
	fstream fread(fileName, ios::in);
	if (!fread)
	{
		cout << "打开文件失败" << endl;
	}
	char key = fread.get();
	cout << key;
	fread.seekg(4,ios::beg);
	key = fread.get();
	fread.seekg(-4,ios::end);
	key = fread.get();
	cout << key<< endl;
	fread.close();
}
int main()
{
	testOpenFile();
	asciRWFile("read.txt","write.txt");
	binaryRWFile("br.txt","bw.txt");
	testSeekRead("test.txt");
	while (1);
	return 0;
}

运行结果:
asciRWFile(“read.txt”,“write.txt”)
C++IO流
binaryRWFile(“br.txt”,“bw.txt”)

C++IO流
testSeekRead(“test.txt”)
C++IO流

上一篇:iOS-framework制作(xcode13)


下一篇:iOS 版本判定