本 Wiki 开启了 HTTPS。但由于同 IP 的 Blog 也开启了 HTTPS,因此本站必须要支持 SNI 的浏览器才能浏览。为了兼容一部分浏览器,本站保留了 HTTP 作为兼容。如果您的浏览器支持 SNI,请尽量通过 HTTPS 访问本站,谢谢!
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
cs:programming:cpp:courses:cpp_basic_deep:chpt_7 [2024/12/09 07:06] – [示例] codinghare | cs:programming:cpp:courses:cpp_basic_deep:chpt_7 [2024/12/10 15:16] (当前版本) – [基于绑定的同步] codinghare | ||
---|---|---|---|
行 200: | 行 200: | ||
* '' | * '' | ||
* '' | * '' | ||
- | * 处理类型单位默认为 '' | + | * 处理类型单位默认为 '' |
- | ==示例== | + | ==基础用法示例== |
* 注意格式化输出会将输入转化为字符串: | * 注意格式化输出会将输入转化为字符串: | ||
<code cpp> | <code cpp> | ||
行 223: | 行 223: | ||
} | } | ||
</ | </ | ||
+ | ==配合模式使用== | ||
+ | <code cpp> | ||
+ | // 默认的模式是从起始位置开始替换 | ||
+ | |||
+ | // 默认输出流中的内容是 test | ||
+ | // 所有输出都会基于 test 输出 | ||
+ | std:: | ||
+ | myObj3 << ' | ||
+ | |||
+ | // 打印结果为 test1 | ||
+ | // stringstream 会自动管理内存 | ||
+ | std::cout << myObj3.str(); | ||
+ | </ | ||
+ | ==str() 的使用注意== | ||
+ | * 返回 '' | ||
+ | * 不要**间接**使用 '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ==使用内存流进行拼接优化== | ||
+ | <code cpp> | ||
+ | // 类似 vector 的空间申请 | ||
+ | // 可能每次都会进行 allocate | ||
+ | std::string s; | ||
+ | s += " | ||
+ | s += " | ||
+ | s += " | ||
+ | |||
+ | // 改良 | ||
+ | // 利用 ostringstream 的大缓存进行拼接 | ||
+ | // 不会频繁的 allocate | ||
+ | std:: | ||
+ | word << " | ||
+ | word << " | ||
+ | word << " | ||
+ | |||
+ | // 结果相同 | ||
+ | std::cout << s; | ||
+ | std::cout << word.str(); | ||
+ | </ | ||
+ | ====流的状态==== | ||
+ | * 提供额外的信息,使使用者针对状态进行对应的操作 | ||
+ | * 使用 '' | ||
+ | * 非正常的状态的值都不是 '' | ||
+ | ===三种异常状态=== | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ==检测异常状态的方法== | ||
+ | [[https:// | ||
+ | <code cpp> | ||
+ | // 使用 cin 的成员检测 | ||
+ | std::cout << std:: | ||
+ | << std:: | ||
+ | << std:: | ||
+ | << std:: | ||
+ | // 转换为 bool 值检测 | ||
+ | << | ||
+ | </ | ||
+ | * '' | ||
+ | * 转换为 bool 值时不会考虑 '' | ||
+ | ==利用状态== | ||
+ | <code cpp> | ||
+ | // 判断之前的输入提取是否成功 | ||
+ | if(std::cin >> x) { //} | ||
+ | </ | ||
+ | ==复位流的状态== | ||
+ | * '' | ||
+ | * '' | ||
+ | <code cpp> | ||
+ | std:: | ||
+ | </ | ||
+ | ==捕获流的异常== | ||
+ | * 可以通过 '' | ||
+ | ====流的定位==== | ||
+ | 提取写入时,需要考虑提取写入的位置(定位)。C++ 为此引入了流的定位: | ||
+ | * 获取流 | ||
+ | * 设置流 | ||
+ | ===获取流位置=== | ||
+ | * '' | ||
+ | * '' | ||
+ | * 两者返回一个为整数的 '' | ||
+ | * '' | ||
+ | ===设置流位置=== | ||
+ | * '' | ||
+ | ==两个重载版本== | ||
+ | * 设置绝对位置:接收 '' | ||
+ | * 设置相对位置:接收基本位置('' | ||
+ | ====流的同步==== | ||
+ | 系统默认的 “缓冲区满再输入到设备的” 行为很可能带来一些问题: | ||
+ | <code cpp> | ||
+ | // 如果 some test 所在流没有满,导致没有被输出到终端 | ||
+ | std::cout << "some test"; | ||
+ | std::string name; | ||
+ | // 导致输入时没有提示 | ||
+ | std::cin >> name; | ||
+ | </ | ||
+ | 这种情况下需要**刷新缓冲区**,也就是强制输出缓冲区内容送到设备上。 | ||
+ | ===基于方法的同步=== | ||
+ | * '' | ||
+ | <code cpp> | ||
+ | // 成员调用 | ||
+ | std:: | ||
+ | // 操纵符 | ||
+ | std::cout << x << std::flush; | ||
+ | </ | ||
+ | * '' | ||
+ | * 同文件同时关联了输入输出流,要对输入流刷新,得到输出流的信息 | ||
+ | * 具体行为与编译器实现有关系 | ||
+ | * '' | ||
+ | * 行为:大于一个字符的流必须被清除出缓存区 | ||
+ | * 结果:自动立即刷新(影响性能) | ||
+ | * 通常与 '' | ||
+ | ===基于绑定的同步=== | ||
+ | C++ 中,任意流都可以绑定到一个**输出流**上。当绑定时,绑定流会记录被绑定流中的信息。当绑定时: | ||
+ | * 绑定流在每次输入(输出)时,都会刷新**被绑定流**的缓冲区 | ||
+ | * 绑定流可以同时与多个输出流绑定 | ||
+ | 这种方法实际上从另外的角度解决了之前提到过的问题: | ||
+ | <code cpp> | ||
+ | // 如果 some test 所在流没有满,导致没有被输出到终端 | ||
+ | std::cout << "some test"; | ||
+ | std::string name; | ||
+ | // 导致输入时没有提示 | ||
+ | std::cin >> name; | ||
+ | </ | ||
+ | 此时如果 '' | ||
+ | 文本输入终端。 | ||
+ | ===与 C 标准 I/O 的同步=== | ||
+ | * 缺省情况下会与 C 同步 | ||
+ | * 可以通过 '' |