- iostream分为输入输出流,即istream和ostream,其针对控制窗口的输入输出;常见的输入输出函数有cin cout cerror;
- fstream主要是来解决文件操作流,也是iostream的衍生类(包含输入输出),我们知道的有ifstream和ofstream;
- sstream主要是来解决c风格的字符串操作流,也是iostream的衍生类(包含输入输出),我们知道的有istrstream和ostrstream;如果想解决c++字符串的流,就要使用stringstream;
以下用存取文件的例子来说明ifstream和ofstream:
void write_file()
{
ofstream myfile("c:\\1.txt", ios::app, _SH_DENYNO);
if (myfile.fail())
{
cout << "文件打开失败";
myfile.open("c:\\1.txt", ios::out | ios::trunc, _SH_DENYNO);
}
myfile << "中国软件开发实验室" << endl << "网址:" << "www.cndev- lab.com" << endl;
myfile.close();
}
void read_file()
{
ifstream myfile("c:\\1.txt", ios::out, _SH_DENYNO);
char ch;
string content;
while (myfile.get(ch))
{
content += ch;
}
cout << content << endl;
myfile.close();
}
/**
* iostream集成输入输出
*/
void read_write(const string &in_path,const string &out_path)
{
ifstream in_file(in_path, ios::out, _SH_DENYWR);
char cc;
string content;
while (in_file.get(cc))
{
content += cc;
}
ofstream out_file(out_path, ios::out, _SH_DENYWR);
out_file << content << endl;
out_file.close();
in_file.close();
}
ifstream和ofstream解决了从流到char *的转换,代码如下:
using namespace std;
void read_str()
{
char *name = "www.cndev-lab.com";
istrstream is(name, strlen(name) + 1);
char read;
while (is.get(read))
{
cout << read;
}
cout << endl;
}
void write_str()
{
int arraysize = 1;
char *pbuffer = new char[arraysize];
ostrstream ostr(pbuffer, arraysize, ios::out);
ostr << arraysize << ends;//使用ostrstream输出到流对象的时候,要用ends结束字符串
cout << pbuffer;
delete[] pbuffer;
}
/**
* stringstream解决类型转换
*/
void test_stringstream()
{
stringstream ost("hello world");
ost.put(‘\n‘);
ost << "OK";
cout << ost.str() << endl;
//stringstream sstr; //--------int转string-----------
//int a = 100; string str;
//sstr << a;
//sstr >> str;
//cout << str << endl; //--------string转char[]--------
//sstr.clear();
////如果你想通过使用同一stringstream对象实现多种类型的转换,
////请注意在每一次转换之后都必须调用clear() 成员函数。
//string name = "colinguan";
//char cname[200];
//sstr << name;
//sstr >> cname;
//cout << cname;
}
对于文件的打开 传输状态 ,c++定义了如下两种方式
第一种,通过状态值判断
- goodbit 无错误
- Eofbit 已到达文件尾
- failbit 非致命的输入/输出错误,可挽回
- badbit 致命的输入/输出错误,无法挽回
/**
* 通过状态修改
*/
void stream_state()
{
int a=0;
cin >> a;
cout << cin.rdstate() << endl;
if (cin.rdstate() == ios::goodbit)
{
cout << "输入数据的类型正确,无错误!" << endl;
}
if (cin.rdstate() == ios_base::failbit)
{
cout << "输入数据类型错误,非致命错误,可清除输入缓冲区挽回!" << endl;
}
}
第二种,通过方法判断
bool bad(); bool eof();
bool fail(); bool good();
void stream_state_method()
{
/*
int a=0; cin >> a;
cout << cin.rdstate() << endl;
cin.clear(ios::goodbit);
cout << cin.rdstate() << endl;
*/
int a=0;
while (1) {
cin >> a;
if (cin.fail()){
cout<<"输入有错!请重新输入"<<endl;
cin.clear();
cin.get();
}
else{
cout<<a; break;
}
}
}
参考文件:http://www.cppblog.com/yuqilin1228/archive/2010/03/26/110620.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-22 11:25:34