我现在使用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
函数来获取
文件*
从
UFILE
,并在其中查找文件指针
文件*
.
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个字符),我猜
重症监护室
在需要读取文件之前已经读取了该文件,然后缓存了结果,因此
FILE
与我正在读取的当前位置不同步。
此外,
documentation
属于
重症监护室
说
不能修改或关闭文件
所以我想我不被允许寻找
文件
.
很难记下我从
超文件
,因为它分散在数十个函数中。所以我想不出一种方法
u_fungetc
因为它需要我知道我想把什么角色放回去。还有,打电话
U-FunGeCc
意思是线性时间,所以我想知道是否有一个更快的方法。
所以是否有可能以某种方式保存
超文件
,并在从中读取一些字符后恢复到该状态?