在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 )
}
}
答案 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
来设置当前位置。
尽管可以更好地使用fgetpos
和fsetpos
来获取所有可能的文件偏移量。
#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