C语言中等同于fstream的peek函数

34

我知道在C++中,可以使用in.peek();来查看下一个字符。

当尝试在C语言中“窥视”文件的下一个字符时,该怎么做呢?

3个回答

59

fgetc+ungetc。也许可以像这样:

int fpeek(FILE *stream)
{
    int c;

    c = fgetc(stream);
    ungetc(c, stream);

    return c;
}

3
条件语句是不必要的:ungetc(EOF, foo) 是定义良好的("如果 c 的值等于宏 EOF 的值,则操作失败且输入流保持不变")。 - Christoph
@Christoph:这很方便。我的手册没有包括那个小贴士,但我链接的那个有... - ephemient
@emil:在C语言中,EOF可以是任何负整数。 - dreamlax
@dreamlax:我理解这一点,但你必须以某种方式表示负整数的二进制形式。例如,-1作为8位字符是:0xff = 11111111。因此,如果getc返回一个8位字符(0x00-0xff),就没有足够的空间来存储EOF。而且由于它是一个32位整数,假设它是4个字符,则可以在范围0x00000100-0xffffffff内返回任何其他值,即(-2147483648 - -1和256 - 2147483647)。 - emil

9
你可以使用getc函数,然后接着使用ungetc函数。

2

你需要自己实现它。使用fread读取下一个字符,使用fseek返回到之前读取的位置。

编辑

 int fsneaky(FILE *stream, int8_t *pBuff, int sz) {
    sz = fread(pBuff, 1, sz, stream)
    fseek(pFile, -sz, SEEK_CUR);
    return(sz);
 }

如果 FILE* 是不可寻址的,比如终端或管道,则这种方法无法工作。 - Maya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接