使UFILE返回其先前状态之一

时间:2018-06-22 12:25:28

标签: c++ file io icu

我目前正在使用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的状态,并从中读取一些字符后恢复到该状态吗?

1 个答案:

答案 0 :(得分:0)

似乎没有人会回答这个问题,所以我在这里提供我的临时解决方案,以防万一有人需要它。

我将只使用环形缓冲区进行缓存,并使用缓存而不是直接使用UFILE