将 UFILE 恢复到其先前的状态之一

Get a UFILE back to one of its previous state

我目前正在使用 ICU 库在 C++ 中解析一些 Unicode 文本。解析器可能会失败,所以当它失败时我需要回滚。例如,我们可能想匹配一个序列aaab,但是在aaa之后我们得到了一个c,那么整个匹配就失败了,逻辑上我们应该回滚到第一个之前a,准备下一次匹配。

我知道当我们在<stdio.h>中使用FILE *时,我们可以直接将文件指针查找到我们预先保存的地方。

FILE* file = fopen("...", "r");
long pos = ftell(file);
// ... read some characters from (FILE *) file
fseek(file, pos, SEEK_SET);

我在 ICU 中尝试过,使用 u_fgetfile 函数从 UFILE 获取 FILE *,并在 FILE * 中寻找文件指针.

UFILE* file = u_fopen("...", "r", nullptr, nullptr);
FILE* internal_file = u_fgetfile(file);
long pos = ftell(internal_file);
// ... read some characters from (UFILE *) file
fseek(file, pos, SEEK_SET);

但是在我的测试用例中,文件指针(从ftell返回)总是在文件的末尾。由于我测试的文件是一个相当小的文件(文件中只有 16 个字符),我猜测 ICU 在我要求它读取之前已经读取了文件,然后缓存了结果,所以文件指针in FILE 与我正在阅读的当前位置不同步。

另外,ICUdocumentation

The FILE must not be modified or closed

所以我想我不允许寻找 FILE 的文件指针。

很难记住我从 UFILE 中读取的所有字符,因为它分散在数十个函数中。所以我想不出使用 u_fungetc 的方法,因为它需要我知道我想放回什么字符。另外,调用u_fungetc意味着回滚的线性时间,所以我想知道是否有更快的方法。

那么是否有可能以某种方式保存 UFILE 的状态,并在从中读取一些字符后恢复到该状态?

好像没人回答这个问题,所以我在这里给出我的临时解决方案,以防有人需要它。

我会直接使用环形缓冲区作为缓存,并使用缓存而不是直接使用UFILE