将 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
与我正在阅读的当前位置不同步。
另外,ICU
的documentation说
The FILE must not be modified or closed
所以我想我不允许寻找 FILE
的文件指针。
很难记住我从 UFILE
中读取的所有字符,因为它分散在数十个函数中。所以我想不出使用 u_fungetc
的方法,因为它需要我知道我想放回什么字符。另外,调用u_fungetc
意味着回滚的线性时间,所以我想知道是否有更快的方法。
那么是否有可能以某种方式保存 UFILE
的状态,并在从中读取一些字符后恢复到该状态?
好像没人回答这个问题,所以我在这里给出我的临时解决方案,以防有人需要它。
我会直接使用环形缓冲区作为缓存,并使用缓存而不是直接使用UFILE
。
我目前正在使用 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
与我正在阅读的当前位置不同步。
另外,ICU
的documentation说
The FILE must not be modified or closed
所以我想我不允许寻找 FILE
的文件指针。
很难记住我从 UFILE
中读取的所有字符,因为它分散在数十个函数中。所以我想不出使用 u_fungetc
的方法,因为它需要我知道我想放回什么字符。另外,调用u_fungetc
意味着回滚的线性时间,所以我想知道是否有更快的方法。
那么是否有可能以某种方式保存 UFILE
的状态,并在从中读取一些字符后恢复到该状态?
好像没人回答这个问题,所以我在这里给出我的临时解决方案,以防有人需要它。
我会直接使用环形缓冲区作为缓存,并使用缓存而不是直接使用UFILE
。