第8章 IO库

IO对象不能复制,即1.IO对象不能存储在vector或其他容器中   2.如果需要传递或返回IO对象,必须传递或返回指向该对象的指针或引用。

一般情况下,如果要传递IO对象以便对它进行读写,用非const引用的方式传递这个流对象。(因为要对IO对象进行读写)

《C++ Primer》学习笔记【第二部分 C++标准库】

 

 

条件状态:IO标准库管理一系列条件状态成员,用来标记给定的IO对象是否处于可用状态,或碰到了哪种特定的错误。流的状态由bad、fail、eof和good操作揭示;clear和setstate操作用于改变条件成员的状态。

输出缓冲区的管理:以下几种情况将导致缓冲区的内容被刷新。

 1.程序正常结束时,清空所有输出缓冲区。

 2.在一些不确定的时候,缓冲区可能已经满了,缓冲区会在下一个值之前刷新。

 3.用操作符显示刷新缓冲区,如endl。

 4.每次输出操作执行完后,用unitbuf操纵符设置流的内部状态,清空缓冲区。

 5.将输出流和输入流关联(用tie函数)起来。在此情况下,在读输入流时刷新其关联的输出缓冲区。标准库将cin和cout绑在一起。

 (如果程序崩溃,则不会刷新缓冲区,最好的方法是保证所有的输出操作都显式地调用了flush或endl; 交互式系统通常应确保它们的输入和输出流是绑在一起的)

文件的输入与输出:

 如果要把fstream对象与另一个不同的文件关联,则必须先close现在的文件,再open另一个文件。

 考虑如何使用循环语句打开一些文件?

//files是一个vector对象,包含一些要打开并读取的文件名
//每次循环构造一个名为input的ifstream的对象
while(it != files.end()){
    ifstream input(it->c_str());
    if(!input) break;
    while(input >> s) process(s);
    ++it;
}
//也可将input定义移到while外,那么需要更仔细地管理流对象。
//每次需要打开新文件,故要关闭当前的文件流
//关闭流不能改变流的内部状态,如果读写操作失败,状态将保持为错误模式,故需要调用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;
}

文件模式:....(此坑待填)

字符串流:

//1.如何每次读入一行,并分别处理每行中的每个单词
string line, word;
while(getline(cin, line)){
    istringstream stream(line);
    while(stream >> word){
        // do sth
    }
}
//2.stringstream提供的转换和/或格式化
//一般情况下,使用输入操作符读取string时,空白符会忽略。
int val1 = 512, val2 = 1024;
ostringstream format_message;
format_message << "val1: " << val1 << "\n" 
               << "val2: " << val2 << "\n";
istringstream input_istring(format_message.str());
string dump;
input_istring >> dump >> val1 >> dump >> val2;
cout << val1 << " " << val2 << endl;

 

第9章 顺序容器

赋值和swap:

赋值相关运算会导致指向左边容器内部的迭代器、引用和指针失效,而swap操作将容器内容交换,迭代器、引用和指针不会失效。(array和string除外)

除array外,swap不对任何元素进行拷贝、删除或插入操作,因此可以保证常数时间内完成。

swap两个array会真正交换他们的元素,但指针、引用和迭代器所绑定的元素保存不变。

网摘string的swap

 1 template<class _Elem,  
 2     class _Traits,  
 3     class _Alloc> inline  
 4     void __CLRCALL_OR_CDECL swap(basic_string<_Elem, _Traits, _Alloc>& _Left,  
 5         basic_string<_Elem, _Traits, _Alloc>& _Right)  
 6     {   // swap _Left and _Right strings  
 7         _Left.swap(_Right);  
 8     }  
 9     void __CLR_OR_THIS_CALL swap(_Myt& _Right)  
10     {   // exchange contents with _Right  
11         if (this == &_Right)  
12             ;   // same object, do nothing  
13         else if (_Mybase::_Alval == _Right._Alval)  
14             {   // same allocator, swap control information  
15  #if _HAS_ITERATOR_DEBUGGING  
16             this->_Swap_all(_Right);  
17  #endif /* _HAS_ITERATOR_DEBUGGING */  
18             _Bxty _Tbx = _Bx;  
19             _Bx = _Right._Bx, _Right._Bx = _Tbx;  
20             size_type _Tlen = _Mysize;  
21             _Mysize = _Right._Mysize, _Right._Mysize = _Tlen;  
22             size_type _Tres = _Myres;  
23             _Myres = _Right._Myres, _Right._Myres = _Tres;  
24             }  
25         else  
26             {   // different allocator, do multiple assigns  
27             _Myt _Tmp = *this;  
28             *this = _Right;  
29             _Right = _Tmp;  
30             }  
31     } 
View Code

相关文章: