What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:programming:cpp:courses:cpp_basic_deep:chpt_7 [2024/12/10 14:32] – [流的定位] codingharecs:programming:cpp:courses:cpp_basic_deep:chpt_7 [2024/12/10 15:16] (当前版本) – [基于绑定的同步] codinghare
行 293: 行 293:
 <code cpp> <code cpp>
 std::cin.clear(); std::cin.clear();
-<code>+</code>
 ==捕获流的异常== ==捕获流的异常==
   * 可以通过 ''exception()'' 捕获流的异常   * 可以通过 ''exception()'' 捕获流的异常
行 311: 行 311:
   * 设置相对位置:接收基本位置(''beg'',''end'',''cur'')+ 位移   * 设置相对位置:接收基本位置(''beg'',''end'',''cur'')+ 位移
 ====流的同步==== ====流的同步====
-  列表项目+系统默认的 “缓冲区满再输入到设备的” 行为很可能带来一些问题: 
 +<code cpp> 
 +// 如果 some test 所在流没有满,导致没有被输出到终端 
 +std::cout << "some test"; 
 +std::string name; 
 +// 导致输入时没有提示 
 +std::cin >> name; 
 +</code> 
 +这种情况下需要**刷新缓冲区**,也就是强制输出缓冲区内容送到设备上。 
 +===基于方法的同步=== 
 +  * ''flush()'':**输出**流同步,刷新缓冲区 
 +<code cpp> 
 +// 成员调用 
 +std::cout.flush(); 
 +// 操纵符 
 +std::cout << x << std::flush; 
 +</code> 
 +  * ''sync()'':**输入**流同步,实现由编译器定义 
 +    * 同文件同时关联了输入输出流,要对输入流刷新,得到输出流的信息 
 +    * 具体行为与编译器实现有关系 
 +  * ''std::unitbuf'': 
 +    * 行为:大于一个字符的流必须被清除出缓存区 
 +    * 结果:自动立即刷新(影响性能) 
 +    * 通常与 ''std::cerr'' (标准错误输出)联用,因为错误信息必须及时更新 
 +===基于绑定的同步=== 
 +C++ 中,任意流都可以绑定到一个**输出流**上。当绑定时,绑定流会记录被绑定流中的信息。当绑定时: 
 +  * 绑定流在每次输入(输出)时,都会刷新**被绑定流**的缓冲区 
 +  * 绑定流可以同时与多个输出流绑定 
 +这种方法实际上从另外的角度解决了之前提到过的问题: 
 +<code cpp> 
 +// 如果 some test 所在流没有满,导致没有被输出到终端 
 +std::cout << "some test"; 
 +std::string name; 
 +// 导致输入时没有提示 
 +std::cin >> name; 
 +</code> 
 +此时如果 ''std::cin'' 绑定了 ''std::cout'',那么当 ''std::cin'' 输入时,就会直接情况输出流的缓存,将我们需要的 //some test//  
 +文本输入终端。 
 +===与 C 标准 I/O 的同步=== 
 +  * 缺省情况下会与 C 同步 
 +  * 可以过 ''sync_with_stdio'' 关闭同步