0

所以我找不到这个问题的答案。

是否有:

  1. 一个类似于 fgetc 的函数,它在指针处检索字符,而不增加指针?

  2. 或者一种减少 fpos_t 对象而不减少它下面的指针的方法。(对这个答案最感兴趣)

对于 C。

4

1 回答 1

4

你有三个选择:

1) 使用ftell / fseek

例子:

  FILE * pFile;
  char c1, c2;
  long offset;
  pFile = fopen ( "example.txt" , "r" );
  offset = ftell(pFile);
  c1 = fgetc(pFile);
  fseek ( pFile , offset , SEEK_SET );
  c2 = fgetc(pFile);
  /* result: c1 == c2 */

(备注:对于二进制流,您也可以尝试使用fseek(pFile, -1, SEEK_CUR)但是对于文本模式,如前所述,获取一个字符可能会使指针前进一个以上的位置)。

2)使用 fgetpos / fsetpos

例子:

  FILE * pFile;
  fpos_t position;
  char c1, c2; 
  pFile = fopen ("example.txt","r");
  fgetpos (pFile, &position);
  c1 = fgetc(pFile);
  fsetpos (pFile, &position);
  c2 = fgetc(pFile);
  /* result: c1 == c2 */

3)使用ungetc

  FILE * pFile;
  char c1, c2;
  c1 = fgetc(pFile);
  ungetc(c1, pFile);
  c2 = fgetc(pFile);
  /* result: c1 == c2 */

这些方法中的哪一种会更有效,取决于平台和实现。例如,可能是在幕后ungetc,例如,将重新读取当前块直到当前点。或者它可能只是将指针移动到内存缓冲区中。

于 2014-10-08T00:52:48.093 回答