目录
前言:
流:若干字节数据从一端到另一端
流类体系:
- 流对象
- 流运算符>> <<
输入输出流
ostream类:
- cout
- cerr
- clog
- cin
- 字符类的处理
- 正常的操作
- 调用成员函数的方式
- 格式控制字符
- 包含头文件iomanip
- 常用的格式控制,一种是调用成员函数的方式,另一种是流控制字符完成
- 设置有效位数: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类
- istringstream类
- ostringstream类
- 一般用stringstream类对象即可
- 获取字符流对象里的数据
- string str() 获取string
- void str(const string&str) 重新设置字符流对象的数据
- 一般字符流对象做字符串处理
- 字符串分割
- 字符串转换问题
#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; }
文件流
- 流类体系
- ofstream类:output输出到文件
- ifstream类读操作
- fstream类可读可写 用的时候包含头文件#inlcude<fstream>
- 打开关闭文件
打开文件:void open(const char* URL,ios::openmode mode);
- 读写方法是:
- ios::in:读的方式打开文件
- ios::out:写的方式打开文件,具有创建功能
- ios::app:追加模式,具有创建功能
- ios::ate:打开已有文件,文件指针指向末尾
- ios::trunc:具有创建功能
- ios::nocreate:不具备创建功能
- ios::noreplace:不具备替换功能
- ios::binary:二进制的形式
- 读写组合用 |
- 可读可写可创建:ios::in|ios::out|ios::trunc
- 二进制的可读可写可创建:ios::in|ios::out|ios::trunc|ios::binary
- 判断文件是否打开成功:
- 用文件流对象重载的运算: !
- is_open成员函数判断:
- 返回true 表示文件打开成功
- 返回false 表示文件打开失败
关闭文件:void close()
- 读写文件
- 流的方式读写
- 二进制的方式读写
- 把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;
}