流:若干字节数据从一端到另一端
流类体系:
流对象:
流运算符:>><< 输入输出流:
ostream类
cout
cerr
clog
字符类的处理:
1.正常操作
2.调用成员函数的方式
格式控制字符
头文件<iomanip>
常用的格式控制,一种是调用成员函数的方式,一种是控制字符去做
设置有效位数:setprecision(int n)
设置精度需要 fixed结合setprecision()使用
istream类 cin
#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
void testOstream() {
//重定向fropen()
cout << "标准输出" << endl; //可重定向
cerr << "标准错误输出" << endl;//不可重定向
clog << "标准错误输出" << endl;//可以重定向为文件
}
void testB() {
//格式控制字符
double p = 34.12341;
cout << "设置有效位数" << setprecision(4) << p << endl;
cout << "设置有效小数位数" << fixed << setprecision(4) << p << endl;
//cout.precision(4);所有流控制字符都会对应一个成员函数的方式
//进制输出
cout << hex << 32 << endl;//十六进制
cout << oct << 15 << endl;//八进制
cout << setbase(10)<< 7 << endl;//
//setw()制表位,默认右对齐
//cout.with()
cout << setiosflags(ios::left);//右对齐iOS::right
cout << setw(8) << "123" << setw(8) << "2131" << setw(8) << 213412 << endl;
cout << setw(8) << "123" << setw(8) << "2131" << setw(8) << 213412 << endl;
}
int main() {
//freopen("1.txt", "r", stdin);
//int a, b;
//scanf("%d%d", &a, &b);//输入由文件完成
//freopen("2.txt", "w", stdout);//输出由文件完成
//cout << a + b << endl;
//字符类处理
//处理一个字符可以用put,可以通过io流对象调用成员函数
//cout.put('a');
//cout << 'a' << endl;
//char c = 'C';
//cout.put(c);
//cout << c << endl;
//cout.write("Iloveyou", 4);//指定输出长度
输入
/*c = cin.get();
cout.put(cin.get());*/
//while (getchar() != '\n');
//char str[20]="";
//cin.getline(str, 20);
//cout.write(str, 20);
testB();
return 0;
}
字符流:
头文件:sstream
子类、(一般用stringstream类对象即可)
istringstream类
ostringstream类
获取字符流对象中的数据
string str()//获取string
void str(const string& str)//重新设置字符流对象的数据
一般字符流对象做字符串处理
字符串的分割
字符串的转换
#include<iostream>
#include<sstream>
#include<cstring>
using namespace std;
//21,1234,453,345,54,12,2,4354按逗号分割
void teststringstream() {
//构建字符流对象,以及获取字符流对象中数据
stringstream sso(string("Iloveyou"));
stringstream ssnull;
ssnull << "我爱你!";
//错误写法stringstream ss = string("Imissyou");
cout << sso.str() << endl;//流对象调用成员函数
cout << ssnull.str() << endl;
string data;
ssnull >> data;
cout << data << endl;
//ssnull.clear()二次操作要做clear
cout << ssnull.str() << endl;
//转换
//数字转字符串
int num = 1234;
char input[20] = "";
stringstream transs(input);
transs << num;
transs >> input;
cout << input << endl;
cout << "---" << endl;
transs.clear();
transs << num;
transs >> input;
cout << input << endl;
stringstream snum("35463124");
int nnum = 0;
snum >> nnum;
cout << nnum << endl;
//分割
stringstream sData("21,1234,453,345,54,12,2,4354");
int numdata[8];
char signal[7];
for (int i = 0; i < 8; i++) {
if (i == 7) {
sData >> numdata[i];
}else
sData >> numdata[i] >> signal[i];
}
for (int i = 0; i < 8; i++) {
cout << numdata[i] << " ";
}
cout << endl;
//多次对同一个数据流做数据操作,一定要做clear()操作
}
int main() {
teststringstream();
char str[20];
int num;
scanf_s("%d%s", &num, str,20);//对比C语言是用格式化控制字符%d%s来判断,C++字符流对象相当于字符流的一个缓冲区
cout << num << " " << str << endl;
return 0;
}
文件流:
流类体系
头文件<fstream>
ofstream类:用这个类去创建对象只能做谢操作不能做读操作。
ifstream类:只读操作
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
判断文件是否打开成功:
1.用文件重载的流对象运算符
file.open("2.txt", ios::out); ?? ?if (!file) { ?? ??? ?cout << "文件打开失败" << endl; ?? ??? ?return; ?? ?}
2.is_open成员函数判断,返回true表示打开成功,返回false表示失败
关闭文件:void.close();
读写文件
1.以流的方式读写
2.以二进制方式读写
把string写到文件中去不能直接实现,要先转换为char*
#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 asciiRWFile(const char* readFileName, const char* writeFileName) {
// fstream read(readFileName, ios::in);
// fstream write(writeFileName, ios::out);
// //成员函数eof()判断是否在文件末尾
// //1.流的方式读写
// //空格和换行会被忽略
// /*while (1) {
//
// char key;
// read >> key;
// if (read.eof()) {
// break;
// }
// write << key;
//
// }*/
// //1.2成员函数方式
// /*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.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 buf[1024] = "";
readFile.read(buf, 1024);
writeFile.write(buf, 1024);
}
readFile.close();
writeFile.close();
}
int main() {
//asciiRWFile("read.txt","write.txt");
//testOpenFile();
binaryRWFile("br.txt", "bw.txt");
return 0;
}
文件指针定位
ifstream类的对象
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);
ios_base::seekdir
ios::beg文件开始位置(类似c语言的SEEK_SET)
ios::end文件结束位置
ios::cur文件当前位置
#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
void tsetSeekRead(const char* fileName) {
fstream fread(fileName, ios::in);
if (!fread) {
cout << "打开文件失败" << endl;
}
fread.seekg(4);
char key = fread.get();
cout << key << endl;
fread.seekg(-4, ios::end);
key = fread.get();
cout << key << endl;
fread.close();
}
int main() {
tsetSeekRead("1.txt");
return 0;
}
|