文件指针操作2

  • 主要使用的函数
    功能比较强悍的主要就是fseek()函数了
    int fseek(FILE * pf, long offset, int WHENCE)
  • 主要使用的场景
    1. 移动到文件中的指定位置,替换该位置的数据
    2. 在文件中遍历搜索给定的元素, 并替换该位置的数据
  • 如下一个小demo,集合了需求的测试
    #include
    #include
    #include
    void fseek_test(FILE * pf); void printf_file(FILE * pf, int size); int search_and_replace(FILE * pf, int size,double beReplaced, double replace);
    int main(void){
    char * path = "E:/test.bin";
    FILE * pf;
    pf = fopen(path, "wb+");
    if(pf == NULL){
    perror("open file err");
    return -1;
    }
    fseek_test(pf);
    if(pf != NULL){
    fclose(pf);
    }
    getchar();
    return 0;
    }
    void fseek_test(FILE *pf){
    double src[10] = {0.1, 0.2, 0.3, 0.4, 0.5, 1.6, 1.7, 1.8,1.9, 2.0};
    int rct = fwrite(src, sizeof(double), 10, pf);
    if(rct != 10){
    perror("write data err");
    clearerr(pf);
    return;
    }
    printf("%s\n", "first the data in the file:"); printf_file(pf, 10); fseek(pf, 0 - 3 *sizeof(double), SEEK_END); double tmp = 18.1; fwrite(&tmp, sizeof(double), 1, pf); printf("%s\n", "change the eight double to 18.1:"); printf_file(pf, 10); if(search_and_replace(pf, 10, 0.5, 100.1) >= 0){
    printf("%s\n", "seach double 0.5 and replace it to 100.1,then show all number");
    printf_file(pf, 10);
    } }
    // param pf : 文件指针 // @param size : 元素总个数 // @param beReplaced : 在文件中需要搜索的并且需要被替换的元素 // @param replace : 需要被替换为的结果元素
    int search_and_replace(FILE * pf, int size, double beReplaced, double replace){
    rewind(pf);
    int i;
    int retVal = -1;
    double tmp = 0;
    for(i = 0; i
    int ret = fread(&tmp, sizeof(double), 1, pf);
    if(ret == 1 && tmp == beReplaced){
    fseek(pf, 0 - sizeof(double), SEEK_CUR);
    tmp = replace;
    fwrite(&tmp, sizeof(double), 1, pf);
    retVal = i;
    break;
    }
    }
    return retVal;
    }
    // @param pf : 文件指针 // @param size : 文件中元素的个数
    void printf_file(FILE * pf, int size){
    rewind(pf);
    double * src = ( double * ) malloc(sizeof(double) * size);
    memset(src, 0, sizeof(double) * size);
    int ret = fread(src, sizeof(double), size, pf);
    if(ret != size){
    perror("read file err");
    clearerr(pf);
    free(src);
    return;
    }
    int i;
    for(i = 0; i
    printf("%f\t",src[i]);
    if((i + 1)%2 == 0 && i != 0){
    printf("\n");
    }
    }
    free(src);
    rewind(pf);
    return;
    }

你可能感兴趣的:(文件指针操作2)