是否有等效于倒带功能的功能,但仅适用于一个令牌?
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
设置当前位置。
尽管如此,最好使用 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
在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
设置当前位置。
尽管如此,最好使用 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