C 语言中控制文件的读取或写入光标
在 C 语言中,文件操作时控制文件的读取/写入光标或位置,可以通过一些标准函数来实现。文件操作中控制光标的函数主要有 fseek()
, ftell()
, 和 rewind()
。这些函数可以帮助你控制文件中数据的读写位置。
1. fseek()
函数
fseek()
函数用于设置文件指针的位置。它允许你在文件中的任意位置进行读写操作。
int fseek(FILE *stream, long int offset, int whence);
stream
:指向文件的指针。offset
:距离whence
位置的偏移量,单位是字节。whence
:指定偏移的起始位置,常用的值有:SEEK_SET
:文件开头(偏移量offset
从文件开头计算)。SEEK_CUR
:当前位置(偏移量offset
从当前文件指针位置计算)。SEEK_END
:文件结尾(偏移量offset
从文件结尾计算)。
返回值:返回 0
表示成功,返回 -1
表示失败。
示例:fseek()
使用
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r+"); // 打开文件进行读写
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
// 将文件指针移动到文件的第10个字节处
fseek(file, 10, SEEK_SET);
char ch = fgetc(file);
printf("Character at position 10: %c\n", ch);
fclose(file);
return 0;
}
解释:
fseek(file, 10, SEEK_SET)
将文件指针移动到文件的第 10 个字节处。- 然后通过
fgetc()
读取该位置的字符。
2. ftell()
函数
ftell()
函数用于返回当前文件指针的位置,即文件中当前读取或写入位置的字节偏移量。
long ftell(FILE *stream);
stream
:指向文件的指针。
返回值:返回当前文件指针的位置(以字节为单位)。如果出错,返回 -1
。
示例:ftell()
使用
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r"); // 以只读模式打开文件
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
// 读取前 5 个字符
char buffer[6];
fread(buffer, sizeof(char), 5, file);
buffer[5] = '\0'; // 添加字符串结束符
printf("Buffer content: %s\n", buffer);
// 获取当前文件指针的位置
long pos = ftell(file);
printf("Current file pointer position: %ld\n", pos);
fclose(file);
return 0;
}
输出:
Buffer content: Hello
Current file pointer position: 5
解释:
ftell(file)
返回当前文件指针的位置。假设文件最初的指针位置在文件的开头,读取 5 个字符后,文件指针会移动到第 6 个字节位置,因此ftell()
返回 5。
3. rewind()
函数
rewind()
函数将文件指针移动到文件的开头,并清除文件的错误标志。
void rewind(FILE *stream);
stream
:指向文件的指针。
返回值:此函数无返回值,操作成功或失败由 ferror()
来检测。
示例:rewind()
使用
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r"); // 以只读模式打开文件
if (file == NULL) {
printf("Error opening file.\n");
return 1;
}
// 读取前 5 个字符
char buffer[6];
fread(buffer, sizeof(char), 5, file);
buffer[5] = '\0'; // 添加字符串结束符
printf("Buffer content: %s\n", buffer);
// 将文件指针移动到文件开头
rewind(file);
// 重新读取文件的第一个字符
char ch = fgetc(file);
printf("First character after rewind: %c\n", ch);
fclose(file);
return 0;
}
输出:
Buffer content: Hello
First character after rewind: H
解释:
- 在调用
rewind(file)
后,文件指针被重新设置到文件的开头。 - 然后,我们通过
fgetc()
读取文件的第一个字符。
4. 常见用法总结
fseek()
:将文件指针移动到文件中的任意位置。可以使用偏移量来指定移动的距离。ftell()
:返回当前文件指针的位置。常用于记录文件指针的当前位置,以便稍后返回。rewind()
:将文件指针移动到文件的开头,并清除文件的错误标志。适用于在文件读取完成后需要重读的情况。
5. 相关错误处理
文件操作中的常见错误处理包括:
- 使用
ferror()
检查文件操作中是否发生错误。 - 使用
feof()
检查是否到达文件的末尾。
int ferror(FILE *stream); // 检查文件操作错误
int feof(FILE *stream); // 检查是否到达文件末尾
总结
fseek()
、ftell()
和rewind()
是 C 语言中文件操作中非常有用的函数,用来控制和获取文件指针的位置。- 使用这些函数可以精确地控制读取和写入的文件位置,尤其是在处理大文件或需要多次遍历文件的情况下。