我目前正在使用ICU库来解析C ++中的一些Unicode文本。解析器可能会失败,因此当解析器失败时,我需要回滚。例如,我们可能想匹配一个序列aaab
,但是在aaa
之后,我们得到一个c
,然后整个匹配失败,逻辑上我们应该回滚到第一个序列之前a
,并准备下一个匹配。
我知道当我们在FILE *
中使用<stdio.h>
时,我们可以只寻找指向我们预先保存的位置的文件指针。
FILE* file = fopen("...", "r");
long pos = ftell(file);
// ... read some characters from (FILE *) file
fseek(file, pos, SEEK_SET);
我在ICU
中进行了尝试,使用u_fgetfile
函数从FILE *
获取UFILE
,并在该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
在我要求读取文件之前已经读取了文件,然后缓存了结果,因此文件指针FILE
中的位置与我正在读取的当前位置不同步。
此外,ICU
的{{3}}说
不得修改或关闭FILE
所以我想我不允许寻找FILE
的文件指针。
要跟踪我从UFILE
读取的所有字符非常困难,因为它分散在数十个函数中。因此,我想不出一种使用u_fungetc
的方法,因为它需要我知道我想放回哪个字符。另外,调用u_fungetc
意味着回滚的线性时间,所以我想知道是否有更快的方法。
那么有可能以某种方式保存UFILE
的状态,并从中读取一些字符后恢复到该状态吗?
答案 0 :(得分:0)
似乎没有人会回答这个问题,所以我在这里提供我的临时解决方案,以防万一有人需要它。
我将只使用环形缓冲区进行缓存,并使用缓存而不是直接使用UFILE
。