C语言文件随机读写:fseek与rewind定位及示例
在C语言开发中,若需从文件中间或任意位置读取数据,必须使用随机读写技术。其核心在于利用 fseek 函数移动文件内部的位置指针,指定起始点与偏移量后,即可通过 fread 和 fwrite 对二进制文件进行精准操作。
文件定位原理与关键函数
顺序读写只能从头开始依次处理数据,而随机读写允许程序跳转到文件的任意部分。实现这一功能的关键是“文件定位”,即改变文件流的当前位置指示器(Position Pointer)。
第1步:理解 fseek 函数的参数结构
fseek 用于将位置指针移动到指定位置。其原型如下:
int fseek(FILE *stream, long offset, int origin);
- stream:指向
FILE对象的指针,即被操作的文件。 - offset:相对于
origin的字节偏移量。类型为long以支持大文件。 - origin:起始参考点,决定了偏移量的计算基准。
第2步:选择正确的起始点常量
C语言定义了三个标准宏来表示 origin 的取值,使用前需包含头文件 stdio.h:
| 起始点 | 常量名 | 数值 |
|---|---|---|
| 文件开头 | SEEK_SET |
0 |
| 当前位置 | SEEK_CUR |
1 |
| 文件末尾 | SEEK_END |
2 |
注意:fseek 主要用于二进制文件。在文本文件中,由于换行符转换等原因,计算的位置可能会出现误差。
第3步:使用 rewind 快速返回文件头
若只需将指针移回文件开头,可使用 rewind 函数,其等价于 fseek(stream, 0L, SEEK_SET):
void rewind(FILE *stream);
随机读写操作流程
完成定位后,即可使用标准的 I/O 函数进行读写。对于结构化数据(如结构体),推荐使用二进制模式打开文件,并使用 fread 和 fwrite 以保持内存布局的一致性。
第4步:编写结构体文件读写示例
以下示例演示如何存储学生信息,并跳过第一个学生,直接读取第二个学生的信息。这体现了随机读写的核心价值:无需遍历前文即可获取目标数据。
#include<stdio.h>
#define N 3
struct stu{
char name[10]; //姓名
int num; //学号
int age; //年龄
float score; //成绩
}boys[N], boy, *pboys;
int main(){
FILE *fp;
int i;
pboys = boys;
// 以二进制读写模式打开文件
if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){
printf("Cannot open file, press any key to exit!\n");
getch();
exit(1);
}
printf("Input data:\n");
for(i=0; i<N; i++,pboys++){
scanf("%s %d %d %f", pboys->name, &pboys->num, &pboys->age, &pboys->score);
}
// 一次性写入所有学生信息
fwrite(boys, sizeof(struct stu), N, fp);
// 关键步骤:定位到第二个学生的起始位置
// 跳过第一个学生的sizeof(struct stu)个字节
fseek(fp, sizeof(struct stu), SEEK_SET);
// 读取一个学生的数据
fread(&boy, sizeof(struct stu), 1, fp);
// 输出结果
printf("%s %d %d %f\n", boy.name, boy.num, boy.age, boy.score);
fclose(fp);
return 0;
}
第5步:验证运行结果
假设输入如下数据:
- Tom 2 15 90.5
- Hua 1 14 99
- Zhao 10 16 95.5
程序执行后,控制台将输出第二个学生的信息:
Hua 1 14 99.000000
常见问题与排错
如果在读取时得到乱码或错误数据,请检查以下几点:
- 文件模式错误:确保使用
"rb"(只读二进制)或"wb+"等二进制模式,而非文本模式(如"w")。 - 结构体对齐差异:
sizeof(struct stu)的大小取决于编译器和平台。如果读写双方环境不同,需确保结构体内存布局一致(必要时使用#pragma pack)。 - 指针越界:在调用
fseek后,检查fread是否成功读取了预期的字节数。
总结
通过掌握 fseek 的定位技巧,开发者可以高效地处理大型数据文件或需要跳跃式访问的记录系统。避免不必要的顺序扫描,提升I/O效率。
以上就是C语言文件随机读写的详细内容,更多关于C语言文件操作的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













