人类的孤独像是一种与生俱来的残疾。

Linux C小程序——对文件中指定行进行修改

C语言 smallfish 1059℃

源函数参考自网络,并在原基础上修改。忘记原创是谁了,侵删。

#define MAX_LINE_LENGTH             1024//假设文件中每一行长度不超过1024字节
static int update_current_log(uint16_t slot)//传入参数
{
    char linebuffer[MAX_LINE_LENGTH + 1] = {0};//用于从文件中读入一行内容
    char target[MAX_LINE_LENGTH + 1] = {0};//查找目标
    long len = 0;
    int line_len = 0;
    int res;

    SIM_TypeDef *sim = &MCUs[(slot-1)/SIM_NUMS].SIM[(slot - 1)%SIM_NUMS];//这是我要修改内容的数据源,你可以根据你的需要改成自己的数据源

    FILE *fp = fopen("logs/current.log", "r+");//以读写方式打开需要修改的文件
    if(fp == NULL){
        printf("open 'logs/current.log' failed.\n");

        if(!is_file_exist("logs/current.log")){//若文件不存在则创建
            fp = fopen("logs/current.log", "a+");
        }
    }

    snprintf(target, MAX_LINE_LENGTH, "SIM[%3d]", slot);//设定需要查找的内容,用于定位修改位置,我的查找字符为:“SIM[xxx]”,其中xxx为三位数字,由slot决定。

    while(fgets(linebuffer, MAX_LINE_LENGTH, fp)){//循环从文件中读入一行,直到文件尾
        line_len = strlen(linebuffer);
        len += line_len;//设定偏移

        if(0 == strncmp(target, linebuffer, strlen(target))){//比较是否查找到目标位置
            len -= line_len;
            res = fseek(fp, len, SEEK_SET);//文件指针定位至行首
            if(res < 0){
                perror("fseek");
                fclose(fp);
                return -1;
            }
            break;//只要查找到一次就退出循环,因此此函数只能修改文件最前面的一处内容,如果有多处出现则需修改此函数
        }
    }
    fprintf(fp, "SIM[%3d], state[%02X], IMSI[%s], ICCID[%s]\n", slot, sim->state, sim->imsi_str, sim->iccid_str);//将修改内容写至目标行

    fclose(fp);//关闭文件
    return 0;
}

 

转载请注明:OpenMind » Linux C小程序——对文件中指定行进行修改

喜欢 (0)