fseek函数
函数设置文件指针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);
ftell函数
函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。
long len = ftell(fp)
fgetpos,fsetpos函数
fseek与ftell返回的是long类型,如果文件很大,超过long的范围,那么该函数会有问题,fgetpos与fsetpos函数可以处理更大的文件类型
返回值:成功返回0,否则返回非0
fflush函数
fflush函数可以将缓冲区中任何未写入的数据写入文件中。
修改配置文件,希望修改实时生效,那么每次修改完成之后我们fflush一次
fread和fwrite函数
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入或读取的数据块数目
只要读取到文件最后,没有完整的读取一个数据块出来,fread就返回0
第一个参数代表void *,写入或者读取的缓冲区
第二个参数是代表写入或读取的时候一个单位的大小
第三个参数是代表写入或读取几个单位
第四个参数是FILE *
fread与feof
注意以下两段代码的区别
while (!feof(p))
{
fread(&buf, 1, sizeof(buf), p);
}
while (fread(&buf, 1, sizeof(buf), p))
代码示例:
#define SEC 0x1234678
// 文件加密.
void file_encode()
{
FILE *p1 = fopen("a.txt", "r");
if (p1 == NULL) {
return ;
}
FILE *p2 = fopen("a.dat", "wb");
if (p2 == NULL) {
return ;
}
char buf[1024] = {0};
while (fgets(buf, p1) != NULL) {
size_t len = strlen(buf);
int i;
for (i = 0; i < len; i++) {
int temp = buf[i] + SEC;
}
fwrite(&temp, sizeof(int), 1, p2);
}
fclose(p1);
fclose(p2);
}
// 文件解密.
void file_decode()
{
FILE *p1 = fopen("a.dat", "rb");
if (p1 == NULL) {
return ;
}
FILE *p2 = fopen("b.txt", "w");
if (p2 == NULL) {
return ;
}
int buf = 0;
while (fread(&buf, 1, sizeof(buf), p1)) {
char temp = buf - SEC;
putc(temp, p2);
}
fclose(p1);
fclose(p2);
}
int main()
{
return 0;
}
// 结构体和二进制文件.
struct student {
unsigned int ID;
char name[32];
};
// 将结构体写入二进制文件.
int main()
{
struct student sts[10] = {{1, "赵一"},{2, "钱二"},{3, "孙三"},
{4, "李四"},{5, "王五"},{6, "周六"},{7, "吴七"}{8, "郑八"}{9, "冯九"}, {10, "陈十"}};
FILE *p1 = fopen("a.txt", "wb");
if (p1 == NULL) {
return 0;
}
// 将结构体数组写入文件.
fwrite(sts, sizeof(struct student), 10, p1);
fclose(p1);
// 读取文件中的结构体数据.
FILE *p2 = fopen("a.txt", "rb");
if (p2 == NULL) {
return 0;
}
struct student st;
while(fread(&st, sizeof(st), 1, p2)) {
printf("ID = %u, name = %s\n", st.ID, st.name);
}
fclose(p2);
// 修改文件中的结构体数据(修改ID=3的数据).
student student st2 = {3, "杨老师"};
FILE *p3 = fopen("a.txt", "rb+");
// 将文件指针移位.
fseek(p3, sizeof(st2) * 2, SEEK_SET);
fwrite(&st2, sizeof(st2), 1, p3);
fclose(p3);
return 0;
}
struct student {
unsigned int ID;
char name[20];
};
int main() {
//system("gedit main.c");
//printf("Hello, World!\n");
struct student sts[10] = {
{1, "111"},
{2, "222"},
{3, "333"},
{4, "444"},
{5, "555"},
{6, "666"},
{7, "777"},
{8, "888"},
{9, "999"},
{10, "1010"},
};
FILE *p1 = fopen("a.txt", "w");
fwrite(sts, sizeof(struct student), 10, p1);
fclose(p1);
// 将文件中的所有结构体数据全部读出.
FILE *p2 = fopen("a.txt", "r");
struct student *pst = calloc(10, sizeof(struct student));
int index = 0;
while (fread(&pst[index], sizeof(struct student), 1, p2)) {
index++;
}
int i;
for (i = 0; i <index ; i++) {
printf("ID = %u name = %s\n", pst[i].ID, pst[i].name);
}
fclose(p2);
return 0;
}