fseek()
fseek()
是 C 语言中的标准库函数,它用于设置文件位置指针的位置。这个位置指针决定了下一次读取或写入操作的起始位置。使用 fseek()
可以在文件中随机访问,这意味着我们不必按顺序读取或写入文件。
函数原型:
int fseek(FILE *stream, long offset, int whence);
参数:
- stream: 要移动其位置指针的文件的
FILE
指针。 - offset: 从基准位置
whence
开始的位移(以字节为单位)。 - whence: 基准位置,它可以是以下之一:
SEEK_SET
: 文件的开头。SEEK_CUR
: 当前文件位置指针的位置。SEEK_END
: 文件的结尾。
返回值:
- 如果成功,则返回 0。
- 如果发生错误,则返回非零值。
示例:
假设我们有一个文件 data.bin
,它包含了连续存储的整数。我们希望跳过前两个整数并读取第三个整数。以下是如何使用 fseek()
完成此任务的示例:
#include <stdio.h>
int main() {
FILE *file;
int value;
file = fopen("data.bin", "rb");
if (file == NULL) {
perror("Failed to open file");
return 1;
}
// 跳过前两个整数
if (fseek(file, 2 * sizeof(int), SEEK_SET) != 0) {
perror("Failed to seek in the file");
fclose(file);
return 2;
}
// 读取第三个整数
fread(&value, sizeof(int), 1, file);
printf("The third integer is: %d\n", value);
fclose(file);
return 0;
}
在上面的示例中,我们使用 fseek()
来跳过文件中的前两个整数。注意,我们使用 SEEK_SET
作为 whence
参数,这意味着 offset
是相对于文件开始的位置。
注意:当我们使用 fseek()
后,任何由 feof()
或 ferror()
设置的错误或文件结束指示符都会被清除。另外,使用 fseek()
后,写入操作可能会在文件中产生一个“空洞”,这在某些文件系统上可能会产生未初始化的数据块。
ftell()
ftell()
是 C 语言标准库中的一个函数,用于获取当前文件位置指针的位置。通常与 fseek()
配合使用,fseek()
用于设置文件位置,而 ftell()
用于查询当前的文件位置。
函数原型:
long ftell(FILE *stream);
参数:
- stream: 要查询其位置指针位置的文件的
FILE
指针。
返回值:
- 成功时,返回当前文件位置指针的位置(以字节为单位,从文件开始处计算)。
- 失败时,返回
-1L
并设置错误指示符。
示例:
考虑一个简单的示例,其中我们首先向一个文件中写入一些数据,然后使用 ftell()
来获取文件位置,接着再写入更多的数据:
#include <stdio.h>
int main() {
FILE *file;
long position;
file = fopen("data.txt", "w+");
if (file == NULL) {
perror("Failed to open file");
return 1;
}
// 写入一些文本
fputs("Hello, World!", file);
// 获取当前文件位置
position = ftell(file);
printf("Current file position: %ld\n", position);
// 写入更多文本
fputs("\nMore text here.", file);
fclose(file);
return 0;
}
在上述示例中,我们首先打开一个文件并写入 “Hello, World!”,然后使用 ftell()
获取当前的文件位置(这应该是 “Hello, World!” 之后的位置)。接着,我们继续在文件中写入更多的文本。
注意:在二进制模式下,文件位置可以被视为文件中的字节偏移量,但在文本模式下,由于平台特定的换行符转换(例如,Windows 使用 \r\n
作为换行符,而 Unix-like 系统使用 \n
),返回的文件位置可能不直接对应于字节数量。因此,在文本模式下使用 ftell()
时,最好只与 fseek()
一起使用,并避免直接解释返回的位置值。