源函数参考自网络,并在原基础上修改。忘记原创是谁了,侵删。
#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小程序——对文件中指定行进行修改