代码之家  ›  专栏  ›  技术社区  ›  Ruifeng Xie

把文件恢复到以前的状态

  •  0
  • Ruifeng Xie  · 技术社区  · 7 年前

    我现在使用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 意思是线性时间,所以我想知道是否有一个更快的方法。

    所以是否有可能以某种方式保存 超文件 ,并在从中读取一些字符后恢复到该状态?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ruifeng Xie    7 年前

    似乎没有人会回答这个问题,所以我在这里给我的临时解决方案,以防任何人可能需要它。

    我将使用一个环形缓冲区作为缓存,并使用缓存而不是直接使用 UFILE .