文件操作(3)

来源:互联网 发布:蜂窝移动数据无法清零 编辑:程序博客网 时间:2024/05/20 03:47

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;}
原创粉丝点击