是否有相当于倒带功能,但只有一个令牌?

时间:2015-02-22 23:16:40

标签: c loops token

在C语言中,回放功能用于将流的位置设置为最开始。我想询问是否有一个等效函数只将一个令牌向左移动流位置。

例如,我有一个名为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 )
    }
}

2 个答案:

答案 0 :(得分:2)

您需要"%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()不会返回读取值,而是返回说明符匹配的参数数量。

答案 1 :(得分:2)

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

尽管可以更好地使用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