C++Primer 标准IO库

1.面向对象的标准库:标准库使用了继承来定义IO类型。在三个头文件中定义,iostream定义读写控制窗口的类型,fstream定义读写文件磁盘的类型,sstream定义读写内存中的字符串对象的类型。每个头文件各有三种类型,这些类型都是从iostream头文件的三种类型派生而来。


2.注意:所描述的流类是由char类型,wchar_t组成的流。由于流对象不能复制,因此不能存储在vector容器中。也不能作为形参和返回类型,必须传递或返回该对象的地址或引用。

ostream & print(ostream & os);

3.条件状态:IO标准库管理一些列条件状态成员来表示io对象是否处于可用状态,或是遇到了特定错误。第一种情况,只要遇到了eof(文件结尾),bad(系统级故障),fail(可恢复的输入错误)任意一种错误均跳出循环。第二种情况,逗号操作符的求解返回的是右边操作数作为整个操作的结果。因此只有eof可以结束这个循环。然后在循环体内检查到底是发生了哪种错误。

while(cin>>word)
{}
while(cin>>word, !cin.eof()){
  if(cin.bad())
     throw runtime_error("IO stream corrupted");
  if(cin.fail()){
     cerr<<" bad data, try again";
     cin.clear(istream::failbit);
     continue;
}

条件状态的设置:setstate,clear,rdstate.其中rdstate()可以读出当前的流状态,clear()可以清楚掉这个状态,就像上面清除failbit状态位一样。另外,setstate也类似于进行位操作。

cin.setstate(ifstream::badbit | ifstream::failbit);
istream::iostate old_state = cin.rdstate();
cin.clear();
process_input();
cin.clear(old_state);

4.一直读取流直到文件结束为止,然后将内容输出到标准输出中,最后重设流为有效,返回该流。

std::istream& get(std::istream& in)
{
  int ival;
  while(in>>ival, !in.eof()){
    if(in.bad()) 
      throw std::runtime_error("IO stream corrupted");
    if(in.fail()){
       std::cerr<<" bad data, try again";
       in.clear();
       in.ignaore(200,' ');
       continue;
     }
   std::cout<<ival<<" ";
  }
  in.clear();
  return in;
}
int main()
{
  double dval;
  get(cin);
  cin>>dval;//重新使用恢复后的流
  cout<<dval<<endl;
  return 0;
}

5.输出缓冲区刷新的原因:

 程序正常结束。缓冲区已经满了。用操作符显示的刷新缓冲区。在每次输出操作执行完后,用unitbuf操作设置流的内部状态,从而清空缓冲区。或者将输入流与输出流绑在一起,任何读入都将刷新输出缓冲区。

cout<<"hi"<<endl;
cout<<"hi"<<fulsh;
cout<<"hi"<<ends;
cout<<unitbuf<<"first"<<" second"<<nounitbuf;


6.文件的输入输出

(1)文件的打开关闭和初始化:ifile是存储文件名的string对象。但是文件名要用C风格字符串,所以需要把string类型的对象转换成C风格字符串。

初始化时就是要绑定到一个文件上。

ifstream infile(ifile.c_str());
ofstream outfile(ofile.c_str());

也可以先定义一个流对象,然后用open来绑定文件。

ifstream infile;
infile.open("in");

(2)检查文件打开是否成功:

if(!infile) cerr<<"error:unable to open input file: ";

(3)重新绑定:

ifstream infile("in");
infile.close();
infile.open("next");

(4)如果打算重用已存在的流对象,那么while循环必须在每次循环时记得关闭close和清楚clear文件流,以免存在文件流状态异常。

ifstream input;
vector<string>::const_iterator it = files.begin();
while(it != files.end())
{
  input.open(it->c_str());
  if(!input) break;
  while(input>>s) process(s);
  input.close();
  input.clear();
  ++it;
}


7.文件模式:模式是文件的属性而不是流的属性。

ofstream outfile;
outfile.open("scratchpad", ofstream::out|ofstream::trunc);
outfile.close();
outfile.open("precious", ofstream::app);
outfile.close();

有效的打开模式组合:默认都是in和out同事打开的。

out:打开文件写,删除文件中已有的数据

out|app:打开文件写,在文件尾写入

out|trunc:与out模式相同

in:打开文件读

in|out:打开文件读写,并定位与文件开头处

in|out|trunc:打开文件读写,并删除文件中已有的数据


8.字符串流:stringstream对象的使用

string line,word;
while(getline(cin,line)){
   istringstream stream(line);  //bind to stream to the line we read
   while(stream>>word){}     //read a word from line
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值