5.11fseek函数
int fseek(FILE * _File, long _Offset, int _Origin);
函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变stream指向的位置,函数返回一个非0值。
实验得出,超出文件末尾位置,还是返回0。往回偏移超出首位置,还是返回0,请小心使用。
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
fseek(fp, 3, SEEK_SET);
5.12 ftell函数
函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
#include <stdio.h>
#include <string.h>
struct student
{
char name[10];
int age;
};
int main05(void)
{
struct student st[5] = { 0 };
int i;
for(i = 0; i < 5; i++)
{
printf("please name:");
scanf("%s", st[i].name);
printf("please age:");
scanf("%d", &st[i].age);
}
FILE *p = fopen("D:\\temp\\a.dat", "wb");
fwrite(st, sizeof(struct student), 10, p);
fclose(p);
return 0;
}
int main02()
{
struct student st = { 0 };
FILE *p = fopen("D:\\temp\\a.dat", "rb");
//fseek(p, sizeof(struct student) * 2, SEEK_SET);//从文件开始位置向后偏移结构student这么多的字节
memset(&st, 0, sizeof(struct student));
fread(&st, sizeof(struct student), 1, p);
printf("name = %s, age = %d\n", st.name, st.age);
fseek(p, 0 - sizeof(struct student), SEEK_CUR);//从当前位置往回偏移
memset(&st, 0, sizeof(struct student));
fread(&st, sizeof(struct student), 1, p);
printf("name = %s, age = %d\n", st.name, st.age);
fseek(p, 0 - sizeof(struct student), SEEK_END);//从文件结尾位置往回偏移
memset(&st, 0, sizeof(struct student));
fread(&st, sizeof(struct student), 1, p);
printf("name = %s, age = %d\n", st.name, st.age);
// while(1)
// {
// memset(&st, 0, sizeof(struct student));
// if (fread(&st, sizeof(struct student), 1, p) == 0)
// break;
// printf("name = %s, age = %d\n", st.name, st.age);
// }
fclose(p);
return 0;
}
int main03()
{
FILE *p = fopen("D:\\temp\\a.txt", "rb");
fseek(p, 2, SEEK_SET);
char buf[100] = { 0 };
fgets(buf, sizeof(buf), p);
printf("buf = %s\n", buf);
fgets(buf, sizeof(buf), p);
printf("ftell = %d\n", ftell(p));
fclose(p);
return 0;
}
int main04()
{
FILE *p = fopen("D:\\temp\\a.txt", "rb");
while(!feof(p))
{
fseek(p, 0, SEEK_END);//偏移到文件最后
char buf[100] = { 0 };
fgets(buf, sizeof(buf), p);
printf("buf = %s", buf);
}
fclose(p);
return 0;
}
void swap(struct student *a, struct student *b)
{
struct student tmp = *a;
*a = *b;
*b = tmp;
}
void bubble(struct student *p, int n)
{
int i;
int j;
for(i = 0; i < n; i++)
{
for(j = 1; j < n - i; j++)
{
if (p[j - 1].age > p[j].age)
{
swap(&p[j - 1], &p[j]);
}
}
}
}
int main(void)
{
struct student st[5] = { 0 };
FILE *p = fopen("D:\\temp\\a.dat", "rb");
int i;
// for(i = 0; i < 5; i++)//读取文件的代码
// {
// fread(&st[i], sizeof(struct student), 1, p);
// }
fread(st, sizeof(struct student), 5, p);
fclose(p);
bubble(st, 5);
// for(i = 0; i < 5; i++)
// {
// printf("name = %s, age = %d\n", st[i].name, st[i].age);
// }
p = fopen("D:\\temp\\b.dat", "wb");
// for(i = 0; i < 5; i++)
// {
// fwrite(&st[i], sizeof(struct student), 1, p);
// }
fwrite(st, sizeof(struct student), 5, p);
fclose(p);
return 0;
}