是否有等效于倒带功能的功能,但仅适用于一个令牌?

Is there an equivalent to the rewind function, but for one token only?

在C语言中,rewind函数用于将流的位置设置到最开始。我想问一下是否有一个等效的函数,将流位置向左移动一个标记。

例如,我有一个名为 FooFile.txt 的文件,其中包含几行由“”空格字符分隔的整数序列。

int main()
{
    // open file stream.
    FILE *FooFile = fopen("FooFile.txt" , "r");
    int Bar = 0;

    // loop through every integer token in the file stream.
    while ( fscanf( FooFile, "%d", &Bar ) == 0 )
    {
        // I don't want to reset the stream to the very beginning.
        // rewind( FooFile );
        // I only need to move the stream back one token.

        Bar = fscanf ( FooFile, "%d", &Bar )
        Bar = fscanf ( FooFile, "%d", &Bar )
    }
}

你需要 "%n" 说明符来知道读取了多少个字符,然后你 fseek() 读取了负数的字符,这是一个例子

#include <stdio.h>

int main()
{
    FILE * file  = fopen("FooFile.txt" , "r");
    int    bar   = 0;
    int    count = 0;

    if (file == NULL)
        return -1;

    while (fscanf(file, "%d%n", &bar, &count) == 1)
    {
        fseek(file, -count, SEEK_CUR);
        /* if you don't re-scan the value, the loop will be infinite */
        fscanf(file, "%d", &bar);
    }

    return 0;
}

请注意,在您的代码中有一个错误,fscanf() 不是 return 读取的值,而是匹配的参数数量说明符。

如果 long 足够大,您可以使用 ftell 获取当前位置,使用 fseek 设置当前位置。

尽管如此,最好使用 fgetposfsetpos 来获得所有可能的文件偏移量。

#include <stdio.h>

fpos_t pos;
if(fgetpos(file, &pos)) abort(); // Get position

/* do naughty things */

fsetpos(file, pos); // Reset position

http://man7.org/linux/man-pages/man3/fseek.3.html
http://en.cppreference.com/w/c/io/fsetpos