流:若干字节数据从一端到达另一端我们叫做流
流类体系:流对象,和流运算符>>? <<
输入输出流
ostream类:cout,cerr,clog,istream类 cin
#include<iostream>
using namespace std;
void testostream()
{
cout << "标准输出" << endl; //可以重定向
cerr << "标准出错" << endl; //不能重定向
clog << "标准错误输出" << endl;//这里可以重定向为文件
}
int main()
{
return 0;
}
很多人对重定向不太了解 ,文件重定向就是程序的输入或者输出都可以由文件来完成
从文件输入到程序中,或者程序中到文件内
#include<iostream>
#include<cstdio>
using namespace std;
void testostream()
{
cout << "标准输出" << endl; //可以重定向
cerr << "标准出错" << endl; //不能重定向
clog << "标准错误输出" << endl;//这里可以重定向为文件
}
int main()
{
int temp, temp2;
freopen("狐狸.txt","r",stdin);//重定向输入当程序运行起来 到该文件中读取数据
scanf("%d%d",&temp,&temp2);//将按照格式格式控制字符拿取数据
cout << temp << temp2 << endl;//我们打印测试
freopen("狐狸2.txt", "w", stdout);//定向为输出
printf("%d", temp+ temp2);//这里的打印将输出到文件中
return 0;
}
关于输出字符类的处理
一种是调用成员函数的,一种是正常调用
#include<iostream>
#include<cstdio>
using namespace std;
void testostream()
{
cout << "标准输出" << endl; //可以重定向
cerr << "标准出错" << endl; //不能重定向
clog << "标准错误输出" << endl;//可以重定向
//字符类的处理
cout.put('A');//调用成员函数
cout << 'A' << endl;//正常的输出
char c = 'W';
cout.put(c);//变量常量都是可以
cout << c << endl;
cout.write("I love you\n",4);//截取输出,这个成员函数需要限定长度
//输入流
//字符输入
c = cin.get();//get()函数返回值的是我们的输入
cout.put(c);
//字符串的输入
while (cin.get() != '\n');//清空缓冲区处理
char str[20] = "";
cin.getline(str,20);
cout.write(str,20);
//注意 处理必须处理为char* 不能处理C++ string类
//格式控制
}
int main()
{
testostream();
return 0;
}
格式控制字符:包含头文件iomanip
一种调用成员函数,一种流控制字符去做
#include<iostream>
#include<cstdio>
#include<iomanip>
using namespace std;
void testiomanip()
{
double pi = 3.1415926535;
cout << setprecision(4);//设置流格式输出。。这里是设置有效位数
cout << pi << endl;
cout << fixed << setprecision(4);//结合fixed才是设置有效小数位
cout << pi << endl;
cout.precision(8);//基本所有流控制符都会对应一个成员函数的方式
cout << pi << endl;
cout << hex << 58 << endl;//十六进制
cout << oct << 48 << endl;//八进制
cout << setbase(16);//设置为16进制 必须输入常用的 8 10 16 没有二进制
cout << 58 << endl;
cout << setw(8);//设置间隔 //默认为右对齐的方式
cout << setiosflags(ios::left);//设置为左对齐
//cout << setiosflags(ios::right);//设置右对齐
cout << setw(8) << 58 << setw(8) << 68 << endl;
}
int main()
{
testiomanip();
return 0;
}
?2.字符流的处理:
? ?字符流头文件 sstream
? ?子类为istreamstream 做输入的字符流类
? ?子类为ostreamstream做输出的流类?
? ? 我们一般用streamstream 可以输入也可以输出
? ? 一般字符流对象用于??字符串分割? ? ????????字符串转换问题
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<sstream>
using namespace std;
void teststringstream()
{ //构建字符流对象
stringstream Fox(string("I am Fox"));//构造方式
stringstream Foxson;
Foxson << "我爱你"; //把数据流进去
cout << Foxson.str();//读取流里面的数据
string data;
Foxson >> data;//将对象流到data里面去
cout << data << Foxson.str() << endl;//不影响原数据
//Foxson.str("");//覆盖方式删除数据
//字符串与数字之间的转换
int Num = 34567;
char input[20] = "";
stringstream tempstr(input);//构建空的字符流对象
tempstr << Num;//将数字流进去
tempstr >> input;//以字符串的方式流出来
cout << input << endl;
//数据是按照控制字符去做转换的
//字符串转数字更加简单
stringstream tempstrnum("12345");
tempstrnum >> Num;
cout << Num << endl;
//字符串的分割
stringstream sdata("56,78,9121,84,48,1841,10");
int numdata[7];
char cdata[6];
for (int i = 0; i < 7; i++)
{
if (i==6)//最后一次没有逗号
{
sdata >> numdata[i];//data是int它会按照整数流对象 56
}
else
{
sdata >> numdata[i];//data是int它会按照整数流对象 56
sdata >> cdata[i];//字符把逗号流走了
//会根据变量的类型去拿取数据
}
}
for (int i = 0; i < 7; i++)
{
cout << numdata[i]<<"\t";
}
cout << endl;
//多次对同一个流数据转换操作,一定要对流对象进行clear操作
tempstr.clear();
tempstr << Num;//将数字流进去
tempstr >> input;//以字符串的方式流出来
cout << input << endl; //多次使用用clear,才能重新流入数据
}
int main()
{
teststringstream();
return 0;
}
?3.文件流
? ofstream 类? //output 输出到文件,写操作
? ifstream? 类 //读操作? ?
? fstream 类//可读可写? ?
? 头文件:fstream
?打开文件 :读写方式
ios::in//读的方式打开文件
ios::out//写的方式打开文件,具有创建功能 ,但是会覆盖文件
ios::app//追加模式
ios::atr//打开已有文件,文件指向文件末尾
ios::trunc//创建功能
ios::nocreate//不具备创建功能
ios::norlace//不替换
ios::binary//二进制方式
组合方式 |
可读可写 ios::in|ios::out
?二进制可读可写 ios::binary|ios::in|ios::out ? ? ? ? ? ?
文件打开成功 返回true,失败返回false
关闭文件 对象.close();
读写方式:
流的方式读写
会忽略空格和换行 这一点要注意
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<sstream>
#include<fstream>
using namespace std;
void asciiRWFile(const char *ReadFlieName,const char *WriteFlieName)
{
fstream read(ReadFlieName,ios::in);
fstream writ(WriteFlieName, ios::out);
//1.流的方式读写
//while (1) //eof没到头 返回的应该是个假 所以取反
//{
// char key;
// read >> key;
// if (read.eof())//eof到头 放回真,于是执行
// {
// break;
// }
// writ << key;//可以直接留到文件对象所指向的文件
//}
//2.流会忽略空格和换行 我们通过成员函数字符方式读写
//while (1)
//{
// char key;
// read.get(key);
// if (read.eof())//eof到头 放回真,于是执行
// {
// break;
// }
// writ.put(key);//输出到指定的文件中
//}
//流字符串读写方式
while (!read.eof())
{
char str[1024] = "";//每一次读都要做初始化
read.getline(str,1024);
writ.write(str,strlen(str));//统计一下可见长度,写出来没有换行
writ << endl;//流一个换行进去
}
read.close();
writ.close();
}
int main()
{
asciiRWFile("读的文件.txt","123.txt");
return 0;
}
二进制读写:
二进制读写相对与字符读写简单太多
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<sstream>
#include<fstream>
using namespace std;
void binaryRWFile(const char* ReadFlieName, const char* WriteFlieName)
{
fstream read(ReadFlieName, ios::in|ios::binary);
fstream writ(WriteFlieName, ios::out|ios::binary);
while (!read.eof())
{
char str[1024] = "";
read.fstream::read(str, 1024);//出现同名问题 类名限定一下
writ.write(str, 1024);
}
read.close();
writ.close();
}
int main()
{
binaryRWFile("读的文件.txt","21323.txt");
return 0;
}
文件指针定位
? ios::beg;//文件开始
? ios::end;//文件末尾
? ios::cur//文件当前位置
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<sstream>
#include<fstream>
using namespace std;
void testSeekRead(const char* ReadFlieName)
{
fstream fread(ReadFlieName, ios::in);
fread.seekg(4);
char key = fread.get();
cout << key << endl;
fread.seekg(-4, ios::end);
key = fread.get();
cout << key << endl;
}
int main()
{
testSeekRead("读的文件.txt");
return 0;
}
|