public member function
<istream> <iostream>

std::basic_istream::sync

int sync();
同步输入缓冲区
同步与流关联的 *流缓冲区* 与其控制的输入序列。

操作的具体细节取决于与流关联的*流缓冲区*对象的特定实现。

内部,该函数通过首先构造一个 sentry 对象(将 noskipws 设置为 true)来访问输入序列。然后(如果 good),它会对其关联的*流缓冲区*对象调用 pubsync(如果 rdbuf 为 null,则该函数返回 -1)。最后,在返回前销毁 sentry 对象。

如果 pubsync 的调用失败(即,它返回 -1),则函数将设置 badbit 标志,并返回 -1。否则返回零,表示成功。

请注意,被调用的函数在不执行任何操作的情况下也可能成功,如果这是为流缓冲区对象同步定义的行为。

调用此函数不会改变 gcount 返回的值。

参数



返回值

如果函数失败,无论是由于没有与流关联*流缓冲区*对象(rdbuf 为 null),还是由于对其 pubsync 成员的调用失败,它都返回 -1
否则,它返回零,表示成功。

错误通过修改*内部状态标志*来指示
flagerror
eofbit-
failbit构造 sentry 失败(例如,当调用前的 *流状态* 不是 good 时)。
badbit调用 pubsync 失败,或流上发生其他错误(例如,函数捕获了内部操作抛出的异常)。
设置后,流的完整性可能受到影响。
一次操作可能设置多个标志。

如果操作设置了已向成员 exceptions 注册的*内部状态标志*,则函数将抛出成员类型为 failure 的异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// syncing input stream
#include <iostream>     // std::cin, std::cout

int main () {
  char first, second;

  std::cout << "Please, enter a word: ";
  first = std::cin.get();
  std::cin.sync();

  std::cout << "Please, enter another word: ";
  second = std::cin.get();

  std::cout << "The first word began by " << first << '\n';
  std::cout << "The second word began by " << second << '\n';

  return 0;
}

此示例演示了 synccin 的某些实现中的行为,它会从标准输入字符队列中删除任何未读取的字符。

可能的输出
Please, enter a word: test
Please enter another word: text
The first word began by t
The second word began by t


数据竞争

修改流对象。
并发访问同一流对象可能导致数据竞争,除了标准流对象 cinwcin 在*与 stdio 同步*时(在这种情况下,不会启动数据竞争,尽管不保证字符从线程中提取或同步的顺序)。

异常安全

基本保证:如果抛出异常,对象处于有效状态。
如果生成*错误状态标志*不是 goodbit 且成员 exceptions 被设置为针对该状态抛出,则抛出成员类型为 failure 的异常。
内部操作抛出的任何异常都会被函数捕获并处理,并设置 badbit。如果 badbit 在上次调用 exceptions 时被设置,则函数会重新抛出捕获到的异常。

另见